Chapter 2 构造函数语意学

Q : 一个空类 默认产生哪些成员函数
A: 构造函数,析构函数, 拷贝构造函数,赋值运算符,取址运算符, 取址运算符 const

2.1 Default Constructor 的构造操作

Q: 什么时候才会合成一个default constructor ?
A: 当编译器需要它的时候。
Q: 什么时候?
A: 如下四种情况
1.带有 default constructor 的 member class object
2.带有 default constructor 的 base class
3.带有 virtual function 的 class(声明或继承)
4.带有 virtual Base Class" 的 class

// 初始化语义
class Top{ 
public: 
    int a;
    Top(int _a):a(_a){} 
}; 
class Left : virtual public Top{ 
public: 
    Left(int _a, int _b):Top(_a), b(_b){} 
    int b;
}; 
class Right : virtual public Top{ 
public: 
    Right(int _a, int _c):Top(_a), c(_c){} 
    int c;
}; 
class Bottom : public Left, public Right{ 
public:
    /*无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类
      与其出现在初始化位置无关
    */
    Bottom(int _a, int _b, int _c, int _d): 
        Top(_a), Left(_a, _b), Right(_a, _c), d(_d){} 
    int d;
};
void foo(const left* ptr) { ptr->a = 1024; }

//可能的编译器转变操作:其中, __vbcX表示编译器所产生的指针,指向virtual base class Top
void foo(const left* ptr) {ptr->_vbcX->a = 1024; }

2.2 Copy Constructor 的构造函数

当class不展现 bitwise copy semantices时,copy constructor产生

2.3 程序转化语意学

copy constructor的应用,迫使编译器多少对程序代码进行转化。尤其当一个函数以传值的方式传回一个class object,
而该class有个copy constructor时。

2.4 成员的初始化队伍

Q : 什么情况下,必须使用member initialization list:
A : 1. 当初始化化一个reference member
A : 2. 初始化一个const member
A : 3. 当调用一个base class的constructor,而它拥有一组参数
A : 4. 当调用一个member class的constructor,而它拥有一组参数

注意:list中的项目顺序是由class中的members声明顺序决定的,不是有initialization list的顺序决定的
注意:initialization list的调用被放在explicit user code之前


shiyang6017
158 声望59 粉丝