c++ - 为什么在三规则中不考虑非默认构造函数?

标签 c++ rule-of-three

三原则(也称为三巨头法则或三巨头法则)是 C++ 中的一条经验法则,它声称如果一个类定义了以下其中一项,它可能应该显式定义所有这三项:析构函数、析构函数、复制构造函数,复制赋值运算符。

为什么非默认构造函数不被视为其中之一?当类中有任何资源管理时,程序员无论如何都必须定义一个非默认构造函数。

最佳答案

Why is a non-default constructor not considered as one of them? When there is any resource managed in the class, programmer has to define a non-default constructor anyway.

这不一定是真的。构造函数可能不会获取任何资源。其他函数也可能获取它们。事实上,可能有许多函数(包括构造函数 本身)可能获取 资源。例如,在 std::vector<T> 的情况下, 它是 resize()reserve() 获取资源。因此,将构造函数视为可能需要资源的其他函数。

这条规则的想法是当你复制时,编译器生成的默认复制代码将不起作用。因此,您需要自己编写复制语义。并且由于类管理资源(哪个函数获取它并不重要),析构函数必须释放它,因为析构函数保证被执行,对于一个完全构造的对象。因此,您还必须定义析构函数。在 C++11 中,您还必须实现移动语义。移动语义的逻辑参数与复制语义的逻辑参数相同,除了在移动语义中,您还更改了。移动语义很像器官捐赠者;当您将自己的器官交给他人时,您就不再拥有它了。

关于c++ - 为什么在三规则中不考虑非默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672163/

相关文章:

c++ - 二年级搬家

c++ - GtkTreeView 交替行颜色

c++ - 我违反了三原则吗?

c++ - 复制堆栈变量时异常的析构函数行为

c++ - 从 char* 缓冲区读取 int32_t 的惯用 cpp14 方法是什么?

c++ - Opengl 照明照亮了错误的表面

c++ - C++项目: Where to define global variable with function

c++ - 三法则的异常(exception)?

c++ - C++11 的三规则变成五规则?

c++ - 什么是三法则?