1. 程式人生 > >c++11 類默認函數的控制:"=default" 和 "=delete"函數 void fun() = default; void fun()=delete;

c++11 類默認函數的控制:"=default" 和 "=delete"函數 void fun() = default; void fun()=delete;

AI pos 析構函數 新特性 inline tor 負責 turn 隱式

轉自:lsgxeva

#define
_CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vector> #include <map> //c++11 類默認函數的控制:"=default" 和 "=delete"函數 /* C++ 的類有四類特殊成員函數,它們分別是:默認構造函數、析構函數、拷貝構造函數以及拷貝賦值運算符。 這些類的特殊成員函數負責創建、初始化、銷毀,或者拷貝類的對象。 如果程序員沒有顯式地為一個類定義某個特殊成員函數,而又需要用到該特殊成員函數時,則編譯器會隱式的為這個類生成一個默認的特殊成員函數。
*/ // C++11 標準引入了一個新特性:"=default"函數。程序員只需在函數聲明後加上“=default;”,就可將該函數聲明為 "=default"函數,編譯器將為顯式聲明的 "=default"函數自動生成函數體。 class X { public: X() = default; //該函數比用戶自己定義的默認構造函數獲得更高的代碼效率 X(int i) { a = i; } private: int a; }; X obj; // "=default"函數特性僅適用於類的特殊成員函數,且該特殊成員函數沒有默認參數。
class X1 { public: int f() = default; // err , 函數 f() 非類 X 的特殊成員函數 X1(int, int) = default; // err , 構造函數 X1(int, int) 非 X 的特殊成員函數 X1(int = 1) = default; // err , 默認構造函數 X1(int=1) 含有默認參數 }; // "=default"函數既可以在類體裏(inline)定義,也可以在類體外(out-of-line)定義。 class X2 { public: X2() = default; //Inline defaulted 默認構造函數
X2(const X&); X2& operator = (const X&); ~X2() = default; //Inline defaulted 析構函數 }; X2::X2(const X&) = default; //Out-of-line defaulted 拷貝構造函數 X2& X2::operator= (const X2&) = default; //Out-of-line defaulted 拷貝賦值操作符 // 為了能夠讓程序員顯式的禁用某個函數,C++11 標準引入了一個新特性:"=delete"函數。程序員只需在函數聲明後上“=delete;”,就可將該函數禁用。 class X3 { public: X3(); X3(const X3&) = delete; // 聲明拷貝構造函數為 deleted 函數 X3& operator = (const X3 &) = delete; // 聲明拷貝賦值操作符為 deleted 函數 }; // "=delete"函數特性還可用於禁用類的某些轉換構造函數,從而避免不期望的類型轉換 class X4 { public: X4(double) { } X4(int) = delete; }; // "=delete"函數特性還可以用來禁用某些用戶自定義的類的 new 操作符,從而避免在自由存儲區創建類的對象 class X5 { public: void *operator new(size_t) = delete; void *operator new[](size_t) = delete; }; void mytest() { X4 obj1; X4 obj2=obj1; // 錯誤,拷貝構造函數被禁用 X4 obj3; obj3=obj1; // 錯誤,拷貝賦值操作符被禁用 X5 *pa = new X5; // 錯誤,new 操作符被禁用 X5 *pb = new X5[10]; // 錯誤,new[] 操作符被禁用 return; } int main() { mytest(); system("pause"); return 0; }

c++11 類默認函數的控制:"=default" 和 "=delete"函數 void fun() = default; void fun()=delete;