背景
C++ 的类有六类特殊的成员函数,分别为:默认构造函数、析构函数、拷贝函数、拷贝赋值函数、移动构造函数、移动拷贝函数。如果程序没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,编译器会隐式地为这个类生成一个默认的特殊成员函数。
=default
例子
class DataOnly {
public:
DataOnly () // default constructor
~DataOnly () // destructor
DataOnly (const DataOnly & rhs) // copy constructor
DataOnly & operator=(const DataOnly & rhs) // copy assignment operator
DataOnly (const DataOnly && rhs) // C++11, move constructor
DataOnly & operator=(DataOnly && rhs) // C++11, move assignment operator
};
使用规则
-
default 函数特性仅用于类的特殊成员函数,且该特殊成员函数没有默认参数。
class X { public: int f() = default: //错误, f()非特殊成员函数 X(int) = default; //错误, 非特殊成员函数 X(int i = 1) = default; // 错误, 含有默认参数 }
既可以在类体里定义(inline),也可以在类体外(out-of-line)定义
class X {
public:
X() = default; // inline
X(const X&); //
X& operator = (const X&);
~X() = default; // inline
}
X::X(const X&) = default; // out of line
X& X::operator = (const X&) = default; // out of line
=delete
为了显式的禁用某个函数,C++11 标准引入了一个新特性:delete 函数。
class X{
public:
X();
X(const X&) = delete; // 声明拷贝构造函数为 deleted 函数
X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 deleted 函数
};
class Y{
public:
// 禁止使用者在堆上申请对象
void *operator new(size_t) = delete;
void *operator new[](size_t) = delete;
};