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

Eri*_*c Z 1 c++ rule-of-three

三规则(也称为三巨头或三巨头的规则)是C++中的经验法则,它声称如果一个类定义了下面的一个,它应该明确地定义所有三个:析构函数,复制构造函数,复制赋值运算符.

为什么非默认构造函数不被视为其中之一?当在类中管理任何资源时,程序员必须始终定义非默认构造函数.

Naw*_*waz 8

为什么非默认构造函数不被视为其中之一?当在类中管理任何资源时,程序员必须始终定义非默认构造函数.

这不一定是真的.构造函数可能不会获取任何资源.其他功能也可以获取它们.实际上,可能存在许多可能获取资源的函数(包括构造函数本身).例如,在的情况下,它是与哪个AQUIRE资源.因此,考虑构造函数就像可能获取资源的其他函数一样.std::vector<T>resize()reserve()

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