[读书笔记] Inside C++ Object笔记(第5章: 关于ctor/dtor/copy-ctor/op=)

1. typedef struct
{
    float x, y, z;
} Point;
编译器并不会产生那个trivial的函数(ctor/dtor/copy-ctor/assign-op),因为它会认为它是一个POD数据结构,程序的行为跟C中的一样。
注意,即使我们往里面增加有参数的构造函数,其它函数也不会被编译器构造出来。因为它们都是trivial的。

2. C++并不支持”临时性的定义“。global在C++中被视为完全定义。C和C++的一个差异是,BSS data segment在C++中相对不重要,C++的所有全局对象都被当作“初始化过的数据”来对待。
所以在C++中,未初始化的内置类型变量,都有初始化过的值,实际上,但是在C中,它们初始值很可能是垃圾数据。

3. C++中可以定义和调用一个pure virtual function,不过它只能被静态的调用,不能经由虚拟机制调用。
唯一的例外是pure virtual dtor,class设计者一定得定义它。因为每一个子类的dtor会被编译器扩展,以静态调用的方式调用其"每一个virtual base"和“上一层base class”的dtor。因此,只要缺乏任何一个base class dtor的定义,就会导致链接失败。

4. 在class的ctor的member initialization list中调用该class的一个虚函数,安全码?
就实际而言,将该函数运行于其class‘s data member的初始化行动中,总是安全的。是因为vptr保证能够在member initialization list被扩展之前,由编译器正确设定好。但是在语意上可能不安全,因为这个虚函数可能依赖于一些数据成员。

vptr的初始化操作发生在什么时候?
在base class ctor调用操作之后,但是在程序员提供的代码或是member initialization list中所列的members 初始化操作之前。
注意即使base class初始化代码写在了member initialization list中,它们也是最先进行初始化,然后才是list中其他对象成员的初始化。

5. 继承子类的dtor执行顺序:
1) dtor本身的代码
2)如果class拥有member class objects,而后者拥有dtor,那么它们会以声明顺序相反的顺序被调用;
3)如果object内带一个vptr,则现在被重新设定,指向适当的base class的virtual table
4) base class's dtor 调用
5) virtual base class's dtor调用
当我们在dtor中调用member function时,对象的蜕变会因为vptr的重新设定而受到影响。

你可能感兴趣的:([读书笔记] Inside C++ Object笔记(第5章: 关于ctor/dtor/copy-ctor/op=))