阻止拷貝的三種方法--Cpp
阿新 • • 發佈:2018-12-19
當一個物件是獨一無二的時候,為這個物件做一個副本有點沒道理,所以我們應阻止對它進行的拷貝,但是,阻止這一動作並不是很直觀,通常來說,你不希望class的某一功能,只要不宣告對應的函式就行了,但這個策略對拷貝建構函式和賦值操作符思是無效的,因為如果你不宣告它們,編譯器會替你宣告一個預設的,那麼該如何解決這個問題呢,通常來說,可以採取如下三種方法。
- 將拷貝建構函式和賦值操作符宣告為私有成員函式,並且只宣告而不實現,這樣似乎變得更安全一些,然而如果類的成員函式和友元函式呼叫它時,將會發揮僧錯誤,不過這種錯誤很容易檢查出來。
class A{
public:
A(){}
~A(){}
private :
A(const A&);
A& operator=(const A&);
};
- 為這兩個操作單獨寫出一個類,如下:
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
//為阻止拷貝與賦值操作符,繼承Uncopyable類;
class A: private Uncopyable (){
...
};
這樣,同樣能達成我們的目的。
- 我們還可以定義刪除的函式,它是這樣一種函式,雖然我們聲明瞭它們,但是我們不能以任何一種方式使用它,在函式的引數列表後面加上=delete來指出我們希望它定義為刪除的。
class Uncopyable{
public:
Uncopyable(const Uncopyable&) = delete;
Uncopyable& operator=(const Uncopyable&) = delete;
};
需要注意的是我們一般不定義解構函式為刪除的,那樣我們將不能銷燬此型別的物件了。