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之前
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。