Skip to the content.

cpp 三/五法则

看这个 PDF 基本上就清晰了:

https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Psyduck/C%2B%2B/copy-control/4.%20%E4%B8%89%E4%BA%94%E6%B3%95%E5%88%99.pdf 析构函数,拷⻉构造函数,拷⻉赋值函数,移动构造函数以及移动赋值函数

https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three

真正的还是得看这句话了: As long as you stay away from raw pointer members, the rule of three is unlikely to concern your own code. 大多数情况下,你都没有必要自己手写一个管理资源的类,因为 std:: 基本上都给你实现好了。 只要避免使用原始指针,那么“三/五法则”你基本上也用不到。 (译注:这点可以从智能指针就可以看出来)

继续

为了 explicit 或者 implict 的控制一个类的对象的拷贝,移动,赋值,销毁,定义了五个特殊成员函数:

  1. copy constructor
  2. copy assignment constructor
  3. move constructor
  4. move assignment constructor
  5. destrutor

A copy constructor of class T is a non-template constructor whose first parameter is T&‍, const T&‍, volatile T&‍, or const volatile T&‍, and either there are no other parameters, or the rest of the parameters all have default values.[^2]

需要析构函数的类也需要拷贝和赋值操作(3/5法则)

需要拷贝操作的类也需要赋值操作,反之亦然。

析构函数如果被删除, 那么该对象的自动删除功能就消失了,不能定义这种类型的变量或成员,但是可以动态分配这种类型的对象(可以 new 但是无法 delete)。

如果一个类有数据成员不能默认构造,拷贝,复制或者销毁,则对应的成员函数将被定义为删除。

一般来说, 赋值运算符组合了析构函数和拷贝构造函数。

注意,是拷贝构造函数,和赋值运算符 拷贝构造函数创建了一个新的对象出来 赋值运算符是本身就存在一个对象的,需要将其中原来的部分删除掉

在赋值运算符中使用 swap 的方法是更加好的,但是实现的前提是正确的实现了拷贝构造函数。因为其中自动发生了一次拷贝构造。

除了性能因素,使用移动的另一个原因是 IO 和 unique_ptr 这种类不能共享资源。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。