首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在三个规则中不考虑非默认构造函数?

为什么在三个规则中不考虑非默认构造函数?
EN

Stack Overflow用户
提问于 2011-10-06 17:01:58
回答 4查看 564关注 0票数 1

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-06 17:06:06

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-10-06 17:05:56

这不是3的规则的意义所在。

任何管理资源的类都会有这个析构函数,因此三个规则无论如何都适用。重点是你并不是绝对需要非默认构造函数,但你确实需要其他的(复制构造函数/赋值操作符)。

至少它过去对于标准容器中的元素是至关重要的。

现在,随着移动语义(c++11)的出现,事情开始发生了一些变化。会有一个5的规则吗?我不知道在“最佳实践”和“经验法则”方面会有什么结果。

事实上,已经可以声明规则三的变体:定义析构函数的类也应该定义复制/移动构造函数和复制/移动赋值操作符。如果定义了复制构造函数,则还应定义复制赋值运算符。如果定义了移动构造函数,则还应该定义移动赋值运算符。

无论如何,这将是我一段时间内的经验法则。

票数 2
EN

Stack Overflow用户

发布于 2011-10-06 17:08:35

如果你获得了任何资源(例如使用new),你是对的,但假设你不会忘记释放析构函数中的资源。一旦你创建了析构函数,三个规则就起作用了,你应该定义所有的三个。

但是,如果您的类中只有一些使用复制语义初始化的成员变量,则不需要析构函数,规则也不适用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7672163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档