一个空类会提供那些函数
在C++中,即使一个类是空的(即不包含任何数据成员和显式声明的成员函数),编译器也会自动为这个类生成一些特殊的成员函数。这些函数被称为默认生成的特殊成员函数,具体包括:
-
默认构造函数 (
default constructor
):- 如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数。这个构造函数没有参数,并且会将类的所有非静态数据成员初始化为其类型默认的初始值(例如,对于内置类型,通常是零值)。如果类中有任何成员需要显式初始化,那么必须自定义构造函数。
-
拷贝构造函数 (
copy constructor
):- 当一个新对象需要从已存在的同类型对象初始化时,编译器会生成一个拷贝构造函数。这个构造函数接收一个同类型的对象引用作为参数,并且会逐个复制源对象的数据成员。
-
拷贝赋值运算符 (
copy assignment operator
):- 如果需要将一个已存在的对象赋值给另一个同类型的对象,编译器会生成一个拷贝赋值运算符。这个运算符接收一个同类型的对象引用作为参数,并且会逐个复制源对象的数据成员。
-
移动构造函数 (
move constructor
):- 在C++11及更高版本中,当一个新对象需要从一个右值引用初始化时,编译器会生成一个移动构造函数。这个构造函数可以用来移动资源(如内存或文件句柄)而不是复制。
-
移动赋值运算符 (
move assignment operator
):- 同样在C++11及更高版本中,当一个对象需要从一个右值引用赋值时,编译器会生成一个移动赋值运算符。这个运算符可以用来移动资源而不是复制。
-
析构函数 (
destructor
):- 即使类是空的,编译器也会生成一个析构函数。析构函数没有参数,且默认情况下它不做任何事情。但是,如果类中有动态分配的资源,比如使用
new
创建的对象,那么应该自定义析构函数来释放这些资源。
- 即使类是空的,编译器也会生成一个析构函数。析构函数没有参数,且默认情况下它不做任何事情。但是,如果类中有动态分配的资源,比如使用
这些默认生成的特殊成员函数在C++中被称为“隐式定义”的函数,因为它们不需要显式地由程序员定义。然而,一旦你定义了任何一个特殊成员函数,编译器就不会再为你生成其余的默认版本,除非你显式地声明它们为default
。例如:
class EmptyClass {
public:
EmptyClass() = default; // 显式要求编译器生成默认构造函数
~EmptyClass() = default; // 显式要求编译器生成析构函数
};
在上面的例子中,尽管EmptyClass
是空的,但我们显式地告诉编译器为我们生成默认构造函数和析构函数。