C++类的默认成员函数有几个?

张开发
2026/4/10 16:39:24 15 分钟阅读

分享文章

C++类的默认成员函数有几个?
C类的默认成员函数数量取决于标准版本C11之前4个“四大金刚”默认构造函数 T()析构函数 ~T()拷贝构造函数 T(const T)拷贝赋值运算符 T operator(const T)C11 及以后6个新增两个移动语义相关函数移动构造函数 T(T)移动赋值运算符 T operator(T)示例class Empty { // 编译器自动生成在需要时 // Empty(); // 默认构造 // ~Empty(); // 析构 // Empty(const Empty); // 拷贝构造 // Empty operator(const Empty); // 拷贝赋值 // Empty(Empty); // 移动构造 (C11) // Empty operator(Empty); // 移动赋值 (C11) };控制生成C11 可以显式控制class T { T() default; // 显式要求生成 T(const T) delete; // 禁止生成 T operator(const T) delete; };详细介绍默认构造函数(Default Constructor)当没有提供任何构造函数时编译器会自动生成一个无参的默认构造函数。如果用户定义了任何构造函数编译器将不再生成默认构造函数除非显式要求使用 default。析构函数(Destructor)用于清理对象。如果用户没有定义编译器会自动生成一个。拷贝构造函数(Copy Constructor)用于通过同类型的另一个对象初始化新对象。形式为T(const T)。如果没有定义编译器会自动生成一个按成员拷贝。拷贝赋值运算符(Copy Assignment Operator)用于将同类型的另一个对象赋值给已存在的对象。形式为T operator(const T)。如果没有定义编译器会自动生成一个按成员赋值。移动构造函数(Move Constructor)C11引入用于通过同类型的右值对象初始化新对象。形式为T(T)。如果没有定义且用户没有声明拷贝构造函数、拷贝赋值运算符、移动赋值运算符和析构函数则编译器会自动生成一个按成员移动。移动赋值运算符(Move Assignment Operator)C11引入用于将同类型的右值对象赋值给已存在的对象。形式为T operator(T)。自动生成的条件与移动构造函数类似。此外有时还会提到取地址运算符(Address-of Operator)通常我们不会特别关注因为编译器会自动生成两个取地址运算符const和非const版本。但严格来说它们也是默认成员函数。形式为T* operator()const T* operator() const取地址运算符我们通常不需要显式声明因为编译器生成的版本已经足够就是返回this。所以我们一般不会去写它们。但如果你需要也可以自定义。实际上在C11之后默认成员函数通常指上面前六个而取地址运算符并不在常规讨论的“默认函数”中。因此我们通常说C11后有六个默认成员函数。

更多文章