淺析c++11中的“=default“和“=delete“

Stay alone發表於2020-11-13

c++11之前,如果我們想禁止類的拷貝行為,需要將拷貝建構函式和拷貝賦值函式宣告為私有的,只允許友元或者成員可以訪問。程式碼如下:

class noncopyable
{
public:
	noncopyable() {};

private:
	noncopyable(const noncopyable&);
	noncopyable& operator=(const noncopyable&);
};

c++11提供了"=delete"顯式禁止類的拷貝,"=default"顯式生成預設函式,程式碼如下:

class noncopyable
{
public:
	noncopyable() = default;
	noncopyable(const noncopyable&) = delete;
	noncopyable& operator=(const noncopyable&) = delete;
};

說明:

1) 如果顯式宣告瞭建構函式,如"noncopyable() = default;",則編譯器不會自動生成預設建構函式,同理適用於虛解構函式、拷貝建構函式、拷貝賦值函式;

2) delete的應用舉例

class A
{
public:
	void test(int) {}
	void test(double) = delete;
};

int main()
{
	A a;
	a.test(1);
	a.test(1.0);  //error

	system("pause");
    return 0;
}

定義一個簡單的類A,其中test(double) = delete; 則類A的物件在呼叫A::test(2.0)時報錯,編譯器提示"無法引用 函式 "A::test(double)" (已宣告 所在行數:22) -- 它是已刪除的函式"  

 

 

相關文章