复制构造函数用于根据一个已有的对象来构造一个新的对象。
1、构造函数何时被调用
有三种情况会以一个对象的内容作为另一个类的对象的初值构造一个对象,分别是:
1)对一个对象做显示的初始化操作时,如
class X { ... };
X x;
X xx = x; // 或 X xx(x);
2)当对象被当作参数传递给某个函数时
3)当函数返回一个类的对象时
2、默认的成员复制初始化
如果class没有提供一个显式的复制构造函数,当class的对象以另一个对象作为初值进行构造时,其内部是以这样的方式完成的:对于基本的类型(如int、数组)的成员变量,会使用位复制从一个对象复制到另一个对象;对于类类型的成员变量,会以递归的方式调用其复制构造函数。
3、复制构造函数何时被编译器合成
当复制构造函数必要时,它会被编译器构造出来。何为必要的时候呢?就是指当class不展现所谓的bitwise copy semantics(逐位复制语义)时。
与默认构造函数一样,若class没有声明一个复制构造函数,就会有一个隐式声明的或隐式定义的复制构造函数出现。复制构造函数分为trivial(没有用的)和nontrivial(有用的)两种。只有nontrivial的复制构造函数才会被编译器合成。判断一个复制构造函数是否为trivial的标准在于class是否展现出bitwise copy semantics。
下面解释什么是bitwise copy semantics。
4、bitwise copy semantics(逐位复制)
在下面的代码片断中: