从根本上隐含声明了四种特殊功能。
问题:
如果用户定义了其中任何一个,[例如:析构函数]将不会声明这三个函数的其余部分。那是对的吗? 要么 它仅适用于默认构造函数,并复制Constructor?
答案 0 :(得分:5)
如果声明自己的任何类型的构造函数(包括复制构造函数),则不再隐式声明默认构造函数。其余的是(除非你自己宣布其中一个)。
但是,如果您发现自己声明了2,3或4中的任何一个,那么即使编译器隐式声明它们,您也很可能应该声明其他两个。这称为rule of three。
在C ++ 11中编辑还有隐式声明的移动复制构造函数和移动赋值运算符,因此三个规则变为五条规则。
答案 1 :(得分:3)
不,您不必仅仅因为声明其他人而明确声明其他人。但是,如果您声明2)
,3)
,4)
之一,则可能还需要声明其他人。
这称为the rule of three。我相信它在C ++ 11中被称为the rule of five。
答案 2 :(得分:1)
如果您定义自己的Foo()
,则仍会声明默认~Foo()
,反之亦然。与赋值运算符和复制构造函数相同。请记住,如果使用参数定义构造函数,则会丢失默认构造函数。你必须这样做才能得到一个:
class Foo
{
public:
Foo(); //Declares a default constructor.
Foo(int);
}
答案 3 :(得分:0)