【轉載】阻止拷貝的三種方式

版權聲明:遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/u012677715/article/details/77967774
有些時候咱們在定義一個類的時候不但願其中的拷貝控制成員(拷貝構造和拷貝賦值)起做用,也就是阻止拷貝,這時候可能有人會想,那咱們乾脆不定義這樣的拷貝控制函數不就OK了,但悲催的是若是本身不定義,好心的編譯器也會及時的學習雷鋒好榜樣幫你合成定義,即傳說中的合成拷貝構造、合成拷貝賦值。既然如此,應該如何操做實現咱們的目的呢,結合effective C++的條款中給出兩種方式,而C++11當中也給出了一種,下面由一個例子提及,簡單介紹三種阻止拷貝的方式。
有一個房產銷售系統類,用來描述待售房屋:程序員

class HomeForSale{...};
1
每一位房屋銷售人員都會號稱每一筆房屋資產都是天上地下獨一無二,沒有兩筆徹底相像。因此咱們也認爲,爲這個類對象作一份副本有點沒道理——怎麼可以複製某些先天獨一無二的東西呢?因此,HomeForSale對象的拷貝動做以失敗收場:函數

HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); //此時調用拷貝構造函數
h1=h2; //此時調用拷貝賦值運算符

按照咱們所想,代碼中的拷貝構造及賦值操做都不該該經過編譯,也就是應該阻止這樣的拷貝操做,前面已經提到過即便程序員本身不定義拷貝控制成員,編譯器也會自行生成默認版本。那麼應該怎樣作呢。
(1)將拷貝控制成員函數聲明爲private且不進行定義
這種方式,將拷貝構造函數和拷貝賦值運算符聲明爲private,阻止了編譯器建立合成版本,同時這些private函數也阻止了用戶調用。而不對其進行定義,也作到了即便是成員函數和友元也沒法進行調用。學習

//將HomeForSale的拷貝構造和拷貝賦值聲明爲private且不對其定義
class HomeForSale{
public:
...
private:
...
HomeForSale(const HomeForSale&); //只有聲明
HomeForSale& operator=(const HomeForSale&);
};

(2)設計一個專門爲了阻止拷貝動做的基類,將鏈接期錯誤轉移至編譯器.net

class Uncopyable{
protected:
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable)
};

爲阻止HomeForSale對象被拷貝,惟一須要作的就是繼承Uncopyable:設計

class HomeForSale:public Uncopyable{
...
};

這種方式行得通,當嘗試拷貝HomeForSale對象,編譯器就試着生成一個拷貝構造函數和一個拷貝賦值運算符,而這些函數的編譯器合成版會嘗試調用其基類的對應成員,那些調用會被編譯器拒絕,由於其基類的拷貝函數是private。
(3)將拷貝控制函數定義爲「刪除的」
在C++11中,經過在函數的參數列表後面加上」=delete」來指出我麼但願將它定義爲刪除的,即雖然聲明瞭它們,但不能以任何方式使用。對象

class HomeForSale{
public:
HomeForSale(const HomeForSale&)=delete; //定義爲刪除的
HomeForSale& operator=(const HomeForSale&)=delete;
};

析構函數不能是delete的,若是析構函數被刪除,就沒法銷燬此類型的對象了。
————————————————
版權聲明:本文爲CSDN博主「無力吐槽的典哥」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/u012677715/article/details/77967774blog

相關文章
相關標籤/搜索