2.2 copy constructor

以一个object内容作为另一个class object的初值

Ⅰ、初始化:X x2 = x1;
Ⅱ、入参
Ⅲ、return

default memberwise initialization

如果class没有提供 expliciti copy constructor,以一个object内容作为另一个class object的初值:是把内建或派生的data member的值从一个object拷贝到另一个object身上。对于内含member class object 的对象,还要以递归的方式对内含的成员类对象施行 memberwise initialization。

一个class object有两种复制方式:

1、初始化:copy constructor
2、指定:copy assignment operator

bitwise copy semantics

如果没有复杂的数据成员,就是bitwise copy semantics,此时copy constructor是trivial。

A a,b;		a=b;
Ⅰ、如果a=b实施的是bitwise copy semantics,编译器生成的伪代码是memcpy(&b,&a,sizeof(a)).
Ⅱ、如果是Default MemberWise Initializetion,就是逐个成员进行复制.

如果是上面的理解,那么bitwise copy semantics就是Default MemberWise Initialization在一些特殊情况下的优化。
而Default member Initialization就是一般情况下的default copy constructor.

如果声明展现出default copy semantics,则不需要合成出一个default copy constructor

class 不展现出 bitwise copy semanitics:

Ⅰ、class 内含一个 member object ,且member object class 含有copy constructor。(has)
Ⅱ、当 class 的父类还有含有 copy constructor(is)
Ⅲ、当 class 声明了virtual functions
Ⅳ、继承链中有 virtual base classes 时,也就是虚继承

重新设定 virtual table 的指针

copy constructor 不展现 bitwise copy semantics。否则将 子类对象拷贝给父类,会父类对象的虚函数指针会指向子类虚函数表

Base bb = son;	// 父类指针指向子类对象,如果直接拷贝了子类对象的vptr。

virtual base class subobject--虚继承

posted @ 2021-04-14 19:26  点|滴  阅读(4)  评论(0)    收藏  举报