特殊成员函数

特殊成员函数是类(或结构)成员函数,在某些情况下,编译器会自动为你生成。 包括默认构造函数析构函数复制构造函数和复制赋值运算符,以及移动构造函数和移动赋值运算符。 如果类未定义一个或多个特殊成员函数,则编译器可以隐式声明和定义所使用的函数。 编译器生成的实现称为默认特殊成员函数。 编译器不会生成不需要的函数。

可以使用 = default 关键字显式声明默认的特殊成员函数。 这使得编译器仅在需要时才定义函数,就像根本没有声明函数一样。

在某些情况下,编译器可能会生成已删除的特殊成员函数,这些函数未定义,因此不可调用。 如果考虑到类的其他属性,对类的特定特殊成员函数的调用没有意义,则可能会发生这种情况。 若要显式防止自动生成特殊成员函数,可以使用 = delete 关键字将其声明为已删除

编译器会生成一个默认构造函数,只有当你没有声明任何其他构造函数时,该构造函数才不采用任何参数。 如果只声明了一个采用参数的构造函数,则尝试调用默认构造函数的代码会导致编译器生成错误消息。 编译器生成的默认构造函数对对象执行简单的逐个成员默认初始化。 默认初始化使所有成员变量处于不确定状态。

默认析构函数对对象执行逐个成员的析构。 仅当基类析构函数为虚拟函数时,它才是虚拟的。

默认的复制和移动构造和赋值操作执行非静态数据成员的逐个成员位模式复制或移动。 仅当未声明析构函数或移动或复制操作时,才会生成移动操作。 仅当未声明任何复制构造函数时,才会生成默认复制构造函数。 如果声明了移动操作,它将被隐式删除。 仅当未显式声明复制赋值运算符时才会生成默认的复制赋值运算符。 如果声明了移动操作,它将被隐式删除。

另请参阅

C++ 语言参考