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