1:总结一下拷贝赋值运算符
- 较为复杂,不做细节讨论
- 其在虚拟继承下行为不佳,需要加以小心的设计和使用说明
- 建议尽可能不要允许虚基类函数的拷贝操作
- 建议不要在虚基类函数中声明数据
2:Explict Initialization List 要注意和成员初始化列表相区别开来。
Point A = {1,2,3};//显示初始化列表
//与构造函数中的成员初始化列表有明显的区别
3:总结一点:继承体系的增加,和继承复杂度的增加以及虚拟继承的引入,都会使得对象的初始化和拷贝操作的时间成本有一定的增加。
4:如果class没有定义一个析构函数,那么只有在类内含有member object 或者是class 的基类有自己的析构函数的状态下,编译器才会自动合成出来一个析构函数。否则,析构函数不会被合成出来。(注意与构造函数与拷贝构造函数之间的区别,这次只有两种情况,也就是说,虚函数的存在,并不需要析构函数的参与)
5:即使是定义了一个构造函数,也不应当理所当然的去定义或者合成一个析构函数,真正影响到它们存在的是是否需要该函数。
6:一个由程序员所定义的析构函数的扩展内容
- 析构函数的本体首先被执行
- 如果class有member object ,而该成员对象有析构函数,那么它们会以声明顺序相反的顺序被调用
- 如果对象中含有vptr,现在会被重新设定,指向适当的基类的虚函数表
- 如果有任何直接的(上一层)非虚基类有析构函数,它们会以声明顺序相反的顺序被调用
- 如果有虚基类函数,且其有析构函数,如若讨论类为,最末端的派生类(most_derived class) ,则这些析构函数会以原来的构造顺序的相反顺序被调用
7:一个类对象的声明结束于析构函数开始执行时,由于每一个基类的析构函数轮番被调用,所以派生类实际上变成了一个完整的对象,随着基类析构函数的调用,类对象的大小逐渐减小,直到最后一个基类的析构函数调用(vptr的变化也随之改变)。