c++11 類默認函數(shù)的控制:"=default" 和 "=delete"函數(shù)

//zz: https://www.cnblogs.com/lsgxeva/p/7787438.html

#define _CRT_SECURE_NO_WARNINGS#include#include#include#include//c++11 類默認函數(shù)的控制:"=default" 和 "=delete"函數(shù)

/*

C++ 的類有四類特殊成員函數(shù),它們分別是:默認構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)以及拷貝賦值運算符。

這些類的特殊成員函數(shù)負責(zé)創(chuàng)建、初始化、銷毀,或者拷貝類的對象。

如果程序員沒有顯式地為一個類定義某個特殊成員函數(shù),而又需要用到該特殊成員函數(shù)時,則編譯器會隱式的為這個類生成一個默認的特殊成員函數(shù)。

*/

// C++11 標準引入了一個新特性:"=default"函數(shù)。程序員只需在函數(shù)聲明后加上“=default;”,就可將該函數(shù)聲明為 "=default"函數(shù),編譯器將為顯式聲明的 "=default"函數(shù)自動生成函數(shù)體。

class X

{

public:

? ? X() = default; //該函數(shù)比用戶自己定義的默認構(gòu)造函數(shù)獲得更高的代碼效率

? ? X(int i)

? ? {

? ? ? ? a = i;

? ? }

private:

? ? int a;

};

X obj;

// "=default"函數(shù)特性僅適用于類的特殊成員函數(shù),且該特殊成員函數(shù)沒有默認參數(shù)。

class X1

{

public:

? ? int f() = default;? ? ? // err , 函數(shù) f() 非類 X 的特殊成員函數(shù)

? ? X1(int, int) = default;? // err , 構(gòu)造函數(shù) X1(int, int) 非 X 的特殊成員函數(shù)

? ? X1(int = 1) = default;? // err , 默認構(gòu)造函數(shù) X1(int=1) 含有默認參數(shù)

};

// "=default"函數(shù)既可以在類體里(inline)定義,也可以在類體外(out-of-line)定義。

class X2

{

public:

? ? X2() = default; //Inline defaulted 默認構(gòu)造函數(shù)

? ? X2(const X&);

? ? X2& operator = (const X&);

? ? ~X2() = default;? //Inline defaulted 析構(gòu)函數(shù)

};

X2::X2(const X&) = default;? //Out-of-line defaulted 拷貝構(gòu)造函數(shù)

X2& X2::operator= (const X2&) = default;? //Out-of-line defaulted? 拷貝賦值操作符

// 為了能夠讓程序員顯式的禁用某個函數(shù),C++11 標準引入了一個新特性:"=delete"函數(shù)。程序員只需在函數(shù)聲明后上“=delete;”,就可將該函數(shù)禁用。

class X3

{

public:

? ? X3();

? ? X3(const X3&) = delete;? // 聲明拷貝構(gòu)造函數(shù)為 deleted 函數(shù)

? ? X3& operator = (const X3 &) = delete; // 聲明拷貝賦值操作符為 deleted 函數(shù)

};

// "=delete"函數(shù)特性還可用于禁用類的某些轉(zhuǎn)換構(gòu)造函數(shù),從而避免不期望的類型轉(zhuǎn)換

class X4

{

public:

? ? X4(double)

? ? {

? ? }

? ? X4(int) = delete;

};

// "=delete"函數(shù)特性還可以用來禁用某些用戶自定義的類的 new 操作符,從而避免在自由存儲區(qū)創(chuàng)建類的對象

class X5

{

public:

? ? void *operator new(size_t) = delete;

? ? void *operator new[](size_t) = delete;

};

void mytest()

{

? ? X4 obj1;

? ? X4 obj2=obj1;? // 錯誤,拷貝構(gòu)造函數(shù)被禁用

? ? X4 obj3;

? ? obj3=obj1;? ? // 錯誤,拷貝賦值操作符被禁用

? ? X5 *pa = new X5;? ? ? // 錯誤,new 操作符被禁用

? ? X5 *pb = new X5[10];? // 錯誤,new[] 操作符被禁用

? ? return;

}

int main()

{

? ? mytest();

? ? system("pause");

? ? return 0;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容