Appearance
= default 可以用于以下几种成员函数的声明:
默认构造函数:
cppclass MyClass { public: MyClass() = default; // 默认构造函数 };拷贝构造函数:
cppclass MyClass { public: MyClass(const MyClass&) = default; // 拷贝构造函数 };拷贝赋值运算符:
cppclass MyClass { public: MyClass& operator=(const MyClass&) = default; // 拷贝赋值运算符 };移动构造函数:
cppclass MyClass { public: MyClass(MyClass&&) = default; // 移动构造函数 };移动赋值运算符:
cppclass MyClass { public: MyClass& operator=(MyClass&&) = default; // 移动赋值运算符 };
需要注意的是,= default 只能用于上述成员函数的声明。对于其他成员函数(如析构函数、成员函数、友元函数等),不能使用 = default 来声明默认生成。默认情况下,如果你没有显式提供它们的定义,编译器会自动生成它们的默认实现。
此外,当你添加了自定义构造函数或析构函数时,编译器将不会自动生成默认构造函数,除非你使用 = default 明确指示编译器生成它。而对于其他成员函数(如拷贝构造函数和拷贝赋值运算符),即使你没有显式定义,编译器也会自动生成默认实现。
同时在声明中添加 = default 又在外部定义相当于重复定义,编译器报错。因此,从某些程度上,起到了和 overwirte 关键词差不多的作用:让头文件更容易理解。