如果不要編譯器自動生成的函數(shù),就明確拒絕

字號:

有時候,我們需要定義一些獨一無二的類,這些類是如此的特別,以至于我們不能將其拷貝或者賦值:
    1 class Family {};
    2
    3 Family mine;
    4 Family your;
    5 Family her(mine);//不能通過編譯
    6 mine = your;     //也不能通過
    可是上一個專題講到,即使我們不定義copy構(gòu)造函數(shù)和copy assignment函數(shù),編譯器還是會自動定義它們,所以,為了阻止上述行為,加入收藏我們一般的解決方法就是:
    1 class Family
    2 {
    3 public:
    4
    5 private:
    6   Family(const Family&);              //我們將其定義在private中
    7   Family& operator=(const Family&);   //并且故意不實現(xiàn)它們:)
    8 }
    這樣,如果用戶無意中調(diào)用它們,就會在編譯期間得到錯誤。而如果你在member函數(shù)和friend函數(shù)中調(diào)用,則會是連接器發(fā)出抱怨;
    也可以將連接期間的問題移到編譯期間,可以這么做:
    1 class Uncopyable
    2 {
    3 protected:
    4   Uncopyable() {};
    5   ~Uncopyable() {};
    6 private:
    7   Uncopyable(const Uncopyable&);             //阻止copy
    8   Uncopyable& operator=(const Uncopyalbe&);  //阻止
    9 };
    10
    11 class Family: private Uncopyable //繼承以后就完成了
    12 {
    13
    14 };