构造函数语义学
2.1 Default Constructor 的建构操作
default constructors 在需要的时候才会被编译器产生出来。只有当编译器需要default constructor的时候才会合成出一个constructor, 只有下面的四种情况才会有nontrivial default constructor产生,其余的都是trivial default constructor
1) 带有Default Constructor 的 Member Class Object如果一个class自己没有定义constructor,但是内含一个member object,而后者含有default constructor,那么次class的implicit default constructor 就是nontrivial,编译器会合成一个constructor .注意被合成出来的constructor 只满足编译器的需要,而不是程序员的需要(只完成他自己向要做的事情)。
如果含有多个class member object ,那么constructor 要求初始化操作按照member object 在class 中的申明次序调用各个的constructors. 2) 带有Default Constructor的Base Class如果没有定义构造函数,编译器会产生一个nontrivial constructor,先调用相应的base class's constructor . 如果用户自己定义了constructor,那么编译器讲会扩展他,讲义调用所有比要至default constructors的程序代码加进去。
3) 带有一个Virtual Function 的 Class : 因为编译器必须要初始化VPTR 和 VTable!
4) 带有一个Virtual Base Class 的 Class : 在此之中,如果向要通过一个指针访问最顶端的class的data member,必须要通过"指向基类的指针"来完成。 pa->_vbcx->i=1024; 而_vbcx则是在class object的创建的时候完成的。
2.2 Copy Constructor的间够操作
由三种情况使用到Copy Constructor: object作为函数参数传递 函数的返回值是object 直接用一个同类实体最为初值而初始化如果class没有定义copy constructor,那么编译器可能合成一个copy constructor——memberwise initialization,或者使用bitwise copy
出现不要,bitwise copy的情况和上面的default construcotr的情况一致,1) class 内含一个member object, 而后者的class具有了一个copy constructor
2)当class 继承一个base class,而base class 好有一个copy constructor
3) class含有Virtual funciton
4) class白绳子一个继承串链,其中具有Virtual base classes .后面两种比较复杂,因为可能出现derived class 和base class之间的对象赋值的情况。必须要保证他们的VPTR的正确性。
2.3下列情况中,必须要使用member initialization list进行data member 的初始化:
1)当初始化一个referecnce member 2)当初始化一个cost member 3)当调用一个base class 的constructor,而他拥有一组参数的时候 4)调用一个member class 的constructor ,而他有一组参数而kist中的项目次序是由class中的members声明次序决定的,而不是有initialization list中的排列次序决定。