首页 > 代码库 > 构造、解构、拷贝语意学

构造、解构、拷贝语意学

如果一个class已经有了bitwise copy语意,所以implict copy assignment operator被视为毫无用处,也根本不会被合成出来,这一点和copy constructor一样的

一个 class对于默认的copy assignment operator,在以下情况下不会表现出bitwise copy语意

1、当class内带一个member object,而其class有一个copy assignment operator时

2、当一个class的base class有一个copy assignment operator时

3、当一个class声明了任何virtual functions(我们一定不能够拷贝有段class object的vptr地址,因为它可能是一个derived class object)

4、当class继承自一个virtual base class(不论此base class有没有copy operator)时

也就是上述四种情况下是没有 bitwise copy语意的,需要编译器自动合成一个函数


有些具有bitwise copy semantics时,由 bitwise copy完成,期间没有使用copy assignment operator。


一个object的声明结束语其destructor开始执行之时,在解构时的难点在于对象的蜕变会用为vptr的重新设定而受到影响。

解构的步骤:

1、destructor的函数本书首先被执行

2、如果class拥有member class objects,而后者拥有destructors,那么他们会以其声明顺序相反被调用

3、如果object内带一个vptr,则现在被重新设定,指向适当之base class的virtual talbe

4、如果有任何直接的(上一层)nonvirtual base classes拥有destructor,他们会以其声明顺序的厢房顺序被调用

5、如果有任何virtual base classes拥有destructor,而当前讨论的这个class是最尾端的class,那么他们会以其原来的狗仔顺序的相反顺序被调用


构造函数经过编译器的处理,构造函数的顺序如下:

1、记录在member initialization list中的data members初始化操作会被放进constructor的函数本身,并以members的声明顺序为顺序

2、如果有一个member并没有出现在member initialization list之中,但他有一个default constructor,那么该default constructor必须被调用

3、在那之前,如果class object有virtual table constructor,它们必须被设定初值,指向适当的virtual table

4、在那之前,所有上一层base class constructors必须被调用,以base class的声明顺序为顺序(与member initialization list中的顺序没关联):

         1)如果base class被列于member initialization list中,那么任何明确指定的参数都应该传递过去

         2)如果 base class没有被列于member initialization list中,而它有default constructor(或default memberwise constructor),那么就调用之

         3)如果base class 是多重继承下的第二或后继的base class,那么this指针必须有所调整

5、在那之前,所有virtual base class constructors必须被调用,从左到右,从最深到最浅:

      1)如果class被列于member initialization list中,那么如果有任何明确指定的参数,都应该传递过去,若没有列于List之中,而class由一个default constructor,也应该调用之

      2)此外,class中的每一个virtual base class subobject的偏移量必须在执行期可被存取

     3)如果class object是最底层的class ,其constructor可能被调用,某些用以支持这个行为的机制必须被放进来

构造、解构、拷贝语意学