三/五法则基本原理

需要自定义析构函数的类也需要自定义拷贝和赋值操作,三者视为整体。

合成拷贝的问题

合成的拷贝操作是浅拷贝,会出现两个指针指向同一块内存的情况,析构时就会对同一块内存释放两次,程序崩溃。

操作依存关系

拷贝和赋值操作也相互依存,同时出现。

默认函数控制

=default用法

自定义了拷贝控制成员后编译器不会再自动生成合成的版本,如果还想使用合成版本,就在定义拷贝控制成员时加上=default来显式要求。

拷贝控制

阻止拷贝

=delete定义为删除的函数:

  • 必须出现在函数第一次声明的时候
  • 可以对任意成员函数使用
  • 但不能删除析构函数

历史做法

旧版本会将拷贝构造函数和拷贝赋值运算符声明为private来阻止拷贝。