C++一个类如果没有显式定义一些函数(如构造函数、析构函数、拷贝函数等),编译器在需要的时候会生成一个默认版本。C++11引入default和delete关键字,增强对类默认函数的控制,当让这不是全部功能。
default
含义:被标识的默认函数将使用类的默认行为。
class Test {
public:
Test() = default;
// Test(int x = 0) = default; // error:不能有默认参数
Test(const Test&) = default;
Test& operator=(const Test&) = default;
~Test();
// Test(int x) = default; // error:Test(int x)不属于编译器默认生成函数
};
inline Test::~Test() = default; // 可以在类定义外显式指定缺省版本
delete
含义:被标识的函数被禁用,不仅仅是类的默认函数,也可以是普通成员函数或非成员函数。
// 类的默认函数
class Test {
public:
// Test() = delete;
Test() = default;
Test(int x) = delete;
Test(const Test&) = default;
Test& operator=(const Test&) = default;
~Test() = default;
void* operator new(size_t) = delete;
};
int main() {
// Test a; // 构造函数和析构函数其中一个delete或者声明private就不能在栈上生成对象
// Test *t = new Test(); // operator new()和operator delete()其中一个delete或者声明private就不能在栈上生成对象
}