假设一个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可能被调用。某些用以支持这个行为的机制必须被放进来