C++11 标准新特性:Defaulted 和 Deleted 函数 (转)
C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。
=default
程序员只需在函数声明后加上“=default;
”,就可将该函数声明为 defaulted 函数,编译器将为显式声明的 defaulted 函数自动生成函数体。例如:
class X{ public: X()=default; X(int i){ a = i; } private: int a; }; X x;
编译器会自动生成默认构造函数X::X(){}
,该函数可以比用户自己定义的默认构造函数获得更高的代码效率。
=delete
程序员只需在函数声明后加上“=delete;
”,就可将该函数禁用。
虽然只显式的禁用了一个拷贝构造函数和一个拷贝赋值操作符,但是由于编译器检测到类X
存在用户自定义的拷贝构造函数和拷贝赋值操作符的声明,所以不会再隐式的生成其它参数类型的拷贝构造函数或拷贝赋值操作符,也就相当于类X
没有任何拷贝构造函数和拷贝赋值操作符,所以对象间的拷贝和赋值被完全禁止了。
class X{ public: X(); X(const X&) = delete; // 声明拷贝构造函数为 deleted 函数 X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 deleted 函数 }; int main(){ X x1; X x2=x1; // 错误,拷贝构造函数被禁用 X x3; x3=x1; // 错误,拷贝赋值操作符被禁用 }