C++创建一个空类的时候,编译器会自动生成哪些函数了
编译器会自动生成以下6个特殊成员函数:
1. 默认构造函数 (Default Constructor)
ClassName();
当没有其他构造函数被显式声明时生成
执行默认的成员初始化(对内置类型不初始化,类类型调用其默认构造函数)
2. 拷贝构造函数 (Copy Constructor)
ClassName(const ClassName&);
用于通过同类型的另一个对象来初始化新对象
执行成员逐个拷贝(浅拷贝)
3. 拷贝赋值运算符 (Copy Assignment Operator)
ClassName& operator=(const ClassName&);
用于将一个对象的值赋给另一个已存在的对象
返回对象的引用以支持链式赋值
4. 析构函数 (Destructor)
~ClassName();
在对象生命周期结束时自动调用
执行资源的清理工作
5. 移动构造函数 (Move Constructor) - C++11及以上
ClassName(ClassName&&);
用于通过右值引用来初始化新对象
可以"窃取"源对象的资源,提高效率
6. 移动赋值运算符 (Move Assignment Operator) - C++11及以上
ClassName& operator=(ClassName&&);
用于通过右值引用来赋值给已存在的对象
同样可以"窃取"源对象的资源
class Empty {}; // 空类// 编译器自动生成等价于:
class Empty {
public:Empty() {} // 默认构造函数Empty(const Empty& other) {} // 拷贝构造函数 Empty(Empty&& other) {} // 移动构造函数 (C++11)Empty& operator=(const Empty& other) { return *this; } // 拷贝赋值Empty& operator=(Empty&& other) { return *this; } // 移动赋值 (C++11)~Empty() {} // 析构函数
};
重要注意事项
一旦显式声明了任何构造函数,编译器不再生成默认构造函数
一旦显式声明了拷贝操作,编译器不再生成移动操作
一旦显式声明了移动操作,编译器不再生成拷贝操作
析构函数通常应该声明为虚函数(如果类可能被继承)