摘要:
铁律一:最好不要在构造函数和析构函数中调用虚函数!构造派生类对象时,首先调用基类构造函数初始化对象的基类部分。在执行基类构造函数时,对象的派生类部分是未初始化的。实际上,此时的对象还不是一个派生类对象。析构派生类对象时,首先撤销/析构他的派生类部分,然后按照与构造顺序的逆序撤销他的基类部分。因此,在运行构造函数或者析构函数时,对象都是不完整的。为了适应这种不完整,编译器将对象的类型视为在调用构造/析构函数时发生了变换,即:视对象的类型为当前构造函数/析构函数所在的类的类类型。由此造成的结果是:在基类构造函数或者析构函数中,会将派生类对象当做基类类型对象对待。而这样一个结果,会对构造函数、析构函 阅读全文
摘要:
一般情况下如果自己不定义赋值构造函数及赋值操作符函数,C++会给生成默认的,对于基本数据类型一般没啥问题,但是对于指针或是对象了就有些问题,需要自己写。《C++ primer》关于自己定义派生类复制构造函数和赋值操作符有介绍。自己总结如下:如果没有必要自己写复制构造函数和赋值操作符,那就可以用系统默认的,能够很好的完成要求;但是一旦决定要自己显式定义,则该定义将完全覆盖默认定义。对派生类进行复制构造时,如果想让基类的成员也同时拷贝,就一定要在派生类复制构造函数初始化列表中显示调用基类复制构造函数(当然在函数体内将基类部分的值拷贝也是可以的,只不过它是先用默认构造函数初始化后再修改的基类成员变量 阅读全文