1. 程式人生 > >阻止拷貝的三種方法--Cpp

阻止拷貝的三種方法--Cpp

當一個物件是獨一無二的時候,為這個物件做一個副本有點沒道理,所以我們應阻止對它進行的拷貝,但是,阻止這一動作並不是很直觀,通常來說,你不希望class的某一功能,只要不宣告對應的函式就行了,但這個策略對拷貝建構函式和賦值操作符思是無效的,因為如果你不宣告它們,編譯器會替你宣告一個預設的,那麼該如何解決這個問題呢,通常來說,可以採取如下三種方法。

  1. 將拷貝建構函式和賦值操作符宣告為私有成員函式,並且只宣告而不實現,這樣似乎變得更安全一些,然而如果類的成員函式和友元函式呼叫它時,將會發揮僧錯誤,不過這種錯誤很容易檢查出來。
class A{
public:
  A(){}
  ~A(){}
private
: A(const A&); A& operator=(const A&); };
  1. 為這兩個操作單獨寫出一個類,如下:
class Uncopyable{
protected:
  Uncopyable(){}
  ~Uncopyable(){}
private:
   Uncopyable(const Uncopyable&);
   Uncopyable& operator=(const Uncopyable&);
};
//為阻止拷貝與賦值操作符,繼承Uncopyable類;
class A: private Uncopyable
(){ ... };

這樣,同樣能達成我們的目的。

  1. 我們還可以定義刪除的函式,它是這樣一種函式,雖然我們聲明瞭它們,但是我們不能以任何一種方式使用它,在函式的引數列表後面加上=delete來指出我們希望它定義為刪除的。
class Uncopyable{
public:
   Uncopyable(const Uncopyable&) = delete;
   Uncopyable& operator=(const Uncopyable&) = delete;
};

需要注意的是我們一般不定義解構函式為刪除的,那樣我們將不能銷燬此型別的物件了。