随笔分类 - C++学习--Essential C++
摘要:C++规定了1.函数模板作友元,但函数模板的参数和类模板的参数无关 对所有实例化类都是友元就是这种写法tempalate<typename valtype>class A{ template <typename T>friend std::ostream& operator<<( std::ostream &, const TemplateClass<T> &); }2.函数模板作友元,且用到了相应类模板的参数 那么它不是所有实例化类的友元,只是特定于一个实例化的类就是这种写法tempalate<typename v
阅读全文
摘要:之前没有碰到过这类情况,也不知道实际工程中有什么奥妙,先来一个小的测试例子看一下运行结果: int a = 1; int b = 2; int *tmp = &a; int *p = tmp;// 第二种情况:int *&p = tmp;(此既是指向指针的引用) p = &b; *p = 5;1、测试此时的a, b , *tmp, *p分别是什么: a = 1, b = 5, *tmp = 1, *p = 5;2、如果是上述第二种情况,即指向指针的引用,那么这些变量又该是什么值呢?答案是: a = 1, b = 5, *tmp = 5, *p = 5; 这是因为指向指针
阅读全文
摘要:一个类A定义如下:template <typename valType>class A {private: valType _val;};然后主要的问题是下面两个拷贝构造函数的区别: 第一种构造: template <typename valType> inline A<valType>::A( const valType &val ) { _val = val; } 第二种构造: template <typename valType> inline A<valType>::A( const valType &val
阅读全文
摘要:一:先说虚拟函数的静态决议(Static Resolution) 在两种情况下,虚拟函数机制不会出现预期行为:1、在基类的constructor和destructor内;2、当我们使用的是基类的对象,而非基类对象的pointer 或 reference时。 上述第二种情况很好理解,第二种情况是C++多态机制的重要概念。第一种情况其实也很简单,但我才刚开始学习C++,怕以后自己会不小心把一些虚函数写在constructor 或 destructor里,固写此文章记录一下,下面给出第一种情况的解释: -----------------摘抄Essential C++解释开始----------...
阅读全文
摘要:先给出文字说明,然后再给出代码解释: 如果我们决定改写基类所提供的虚拟函数,那么派生类所提供的新定义,其函数型别必须完全符合基类所声明的函数原型,包括:参数列、返回型别、常量性(const-ness)。 下面给出程序说明:基类num_sequence中声明虚拟函数what_am_i(),派生类中改写该函数。 1、正确的写法 1.1 基类的声明1 #pragma once2 3 class num_sequence4 {5 public:6 num_sequence(void);7 virtual const char* what_am_i() const { ret...
阅读全文
摘要:之前也知道引用和指针的区别,但如果现在让我说他们两个有什么区别,我还是不太能全部说出来,(红色标记一下:引用和指针的异同有哪些?)之所以不能说出他两的区别,不是因为我记忆力不好,而是没有过实际代码的体验。在看Essential C++时,碰到下面的代码,感觉能够说明一些他两的用法。下面给出代码和书上的说明:首先说明一下这里基类num_sequence和子类Fibonacci的目的。基类是一系列不同类型数列的抽象,比如斐波那契数列等等(这里仅以Fibonacci来举例说明子类)。先给出第一次设计基类和子类的代码:(第一次设计时基类不保存具体的数列Vector,只是一些子类抽象出来的函数)1 ..
阅读全文
摘要:问题1: 在A.h中 声明了static std::vector<int> _elems; 然后再A.cpp中 再一次忘了 添加 std::vector<int> Fibonacci::_elems; 尽管后来想起来了,但第一次添加时依然写错了代码,写成了std::vector<int> _elems;问题2: 基类num_sequence.cpp中 重载了std::ostream& operator<<( std::ostream &os, const num_sequence &ns ){return ns.print
阅读全文
摘要:OperatorEqual.h 1 #pragma once 2 3 class OperatorEqual 4 { 5 public: 6 OperatorEqual(void); 7 ~OperatorEqual(void); 8 9 public:10 int _index;11 12 public:13 OperatorEqual(int index) : _index(index) {}14 bool operator==(OperatorEqual& rhs);15 };OperatorEqual.cpp 1 #include "StdA...
阅读全文
摘要:今天在看Essential C++ 第5章时,看到这句话: 一般而言,在基类和派生类中提供同名的non-virtual函数,并不是好的解决方法。基于此点而归纳出来的结论或许是:基类中的所有函数都应该被声明为virtual。我并不认为这是个正确的结论,但它的确可以马上解决我们所面临的两难困境。 上述作者描述中的红色字体部分,暂时还不知道是什么原因。下面先举个例子说明一下为什么“在基类和派生类中提供同名的non-virtual函数,并不是好的解决方法”。1、Base.h文件:定义了一个display()函数1 class Base2 {3 public:4 Base(void);5 ...
阅读全文
摘要:本篇日志是作为菜鸟C++学员,写的一篇调试错误的过程,旨在记录自己的学习过程,帮助自己提高,后面附有我的代码。 今天早上在看Essential C++ P125时,想照着书上的例子写一次,看看运行结果。 结果当我抄书上的代码时,一直从书第四章开头找到了P125,原因是书上是按照函数过程这么讲的,造成我抄完代码也不知所以然,结果当然就是编译不通过了。 第一个问题: 当时第一次出现的错误是LNK2001,好像是这个编号,然后我就试,看是不是这里的问题,改一次编译一次,当然这样是没有结果的。最后我想到了百度,百度以后,得到的结果是声明的变量在另一个文件里面找不到。 也就是说这时候才找到问题...
阅读全文

浙公网安备 33010602011771号