4

从根本上隐式声明了四个特殊函数。

  1. 默认构造函数
  2. 默认析构函数
  3. 默认赋值运算符
  4. 默认成员复制操作符

问题:

如果其中任何一个是由用户定义的,则 [eg: Destructor ] 其余三个函数将不会被声明。那是正确的吗?或者它仅适用于默认构造函数,并复制构造函数?

4

4 回答 4

5

如果您声明自己的任何类型的构造函数(包括复制构造函数),则不再隐式声明默认构造函数。其余的是(除非您自己声明了其中一个)。

但是,如果您发现自己声明了 2、3 或 4 中的任何一个,那么您很可能应该声明其他两个,即使编译器隐式声明了它们。这被称为三法则

在 C++11 中编辑也隐式声明了移动复制构造函数移动赋值运算符,因此三的规则变成了五的规则。

于 2012-07-26T14:18:43.750 回答
4

Howard Hinnant https://howardhinnant.github.io/classdecl.html在本页末尾提供了非常翔实和简洁的表格

在此处输入图像描述

于 2020-09-08T21:59:03.740 回答
3

不,您不必仅仅因为您正在声明一个而明确声明其他人。但是,如果您声明 , , 之一,2)您可能还需要声明其他的。3)4)

这称为三法则。我相信这 在 C++11 中被称为五法则。

于 2012-07-26T14:18:38.977 回答
1

如果您定义自己的,则仍将声明Foo()默认值,反之亦然。~Foo()与赋值运算符和复制构造函数相同。请记住,如果您使用参数定义构造函数,则会丢失默认构造函数。你必须这样做才能得到一个:

class Foo
{
public:
  Foo(); //Declares a default constructor.
  Foo(int);
}
于 2012-07-26T14:19:10.163 回答