复制控制是定义任意 C++ 类必不可少的部分。
当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么。
以上这些是通过定义复制构造函数、赋值操作符和析构函数来达到的。
如果没有显式定义复制构造函数或赋值操作符,编译器(通常)会为我们定义。
复制构造函数,具有单个形参,该形参(常用 const 修饰)是对该类类型的引用。
1) 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。
2) 当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。
析构函数:当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。
1) 析构函数可用于释放对象时构造或在对象的生命期中所获取的资源。
2) 不管类是否定义了自己的析构函数,编译器都自动执行类中非 static 数据成员的析构函数。
与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。
右操作数为类类型的版本比较特殊:如果我们没有编写这种版本,编译器将为我们合成一个。
复制构造函数、赋值操作符和析构函数总称为复制控制。
编译器自动实现这些操作,但类也可以定义自己的版本。
通常,编译器合成的复制控制函数是非常精练的,
但对某些类而言,依赖于默认定义会导致灾难。
实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认版本。
当类具有指针成员的情况时通常需要类定义自己的复制控制成员。
编写自己的复制构造函数时,必须显式复制需要复制的任意成员。
显式定义的复制构造函数不会进行任何自动复制。
(PS:“复制控制” 这一章感觉是需要精读的章节,先了解个大概,等待下次专攻。)