1. 程式人生 > >條款06:若不想使用編譯器自動生成的函式,就該明確拒絕

條款06:若不想使用編譯器自動生成的函式,就該明確拒絕

結論1:為駁回編譯器自動(暗自)提供的機能,可將相應的成員函式宣告為private並且不予實現。

一般而言這個做法並不絕對安全,因為member函式和friend函式還可以呼叫private函式,此時可以將copy建構函式和copy assignment操作符宣告在一個專門為了阻止coping動作而設計的base class內。

例如:

class Uncopyable {
protected://允許derived物件構造和析構
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable &);//但阻止coping
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale : private Uncopyable {
...
};

當嘗試複製HomeForSale物件時,編譯器便生成一個copy建構函式和一個copy assignment操作符,這些函式會嘗試呼叫其base class的對應函式,那些呼叫則會被編譯器拒絕,因為其base class的對應函式為private的。