隐式声明了特殊成员函数

时间:2012-07-26 14:16:48

标签: c++

从根本上隐含声明了四种特殊功能。

  1. 默认构造函数
  2. 默认析构函数
  3. 默认分配运算符
  4. 默认的成员复制运算符
  5. 问题:

    如果用户定义了其中任何一个,[例如:析构函数]将不会声明这三个函数的其余部分。那是对的吗?  要么 它仅适用于默认构造函数,并复制Constructor?

4 个答案:

答案 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)

霍华德·辛南特https://howardhinnant.github.io/classdecl.html

在此页末尾提供了一个非常有用且简洁的表格

enter image description here