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产生
code
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,而它拥有一组参数
ci
注意:list中的项目顺序是由class中的members声明顺序决定的,不是有initialization list的顺序决定的
注意:initialization list的调用被放在explicit user code以前
编译器