讀書筆記《Effective c++》 條款06 若不想使用編譯器自動生成的函數,就應該明確拒絕


如果不希望編譯器自動生成一些函數,例如樹葉類不喜歡有賦值構造函數,因爲“世界上沒有完全相同的兩片葉子”,有兩個方法:


a.本書中介紹的,將其聲明爲private而且不提供函數實現。


  只聲明成private還是不夠,因爲其他成員函數和friend函數還是能調用,所以好的做法還要不提供函數實現,當然,聲明中最好也不寫參數名。

 

  當然,可以聲明一個base class,裏面將不需要編譯器生成的函數聲明成private並且不實現,其他類只需要從它繼承就可以了。


b.在c++11中的方法就更簡單了,c++11提供了delete關鍵字。

class LeafOfTree{
public:
  LeafOfTree() = default;
  ~LeafOfTree() = default;

  LeafOfTree(const LeafOfTree&) = delete;  // mark copy ctor or copy assignment operator as deleted functions
  LeafOfTree & operator=(const LeafOfTree&) = delete; 
};

delete關鍵字還可以用在函數重載和模板特化中,禁止調用指定參數類型的函數(模板),可參加這位朋友的blog

https://www.cnblogs.com/xinxue/p/5503836.html





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章