从根本上隐式声明了四个特殊函数。
- 默认构造函数
- 默认析构函数
- 默认赋值运算符
- 默认成员复制操作符
问题:
如果其中任何一个是由用户定义的,则 [eg: Destructor ] 其余三个函数将不会被声明。那是正确的吗?或者它仅适用于默认构造函数,并复制构造函数?
从根本上隐式声明了四个特殊函数。
问题:
如果其中任何一个是由用户定义的,则 [eg: Destructor ] 其余三个函数将不会被声明。那是正确的吗?或者它仅适用于默认构造函数,并复制构造函数?
如果您声明自己的任何类型的构造函数(包括复制构造函数),则不再隐式声明默认构造函数。其余的是(除非您自己声明了其中一个)。
但是,如果您发现自己声明了 2、3 或 4 中的任何一个,那么您很可能应该声明其他两个,即使编译器隐式声明了它们。这被称为三法则。
在 C++11 中编辑也隐式声明了移动复制构造函数和移动赋值运算符,因此三的规则变成了五的规则。
Howard Hinnant https://howardhinnant.github.io/classdecl.html在本页末尾提供了非常翔实和简洁的表格
如果您定义自己的,则仍将声明Foo()
默认值,反之亦然。~Foo()
与赋值运算符和复制构造函数相同。请记住,如果您使用参数定义构造函数,则会丢失默认构造函数。你必须这样做才能得到一个:
class Foo
{
public:
Foo(); //Declares a default constructor.
Foo(int);
}