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

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

通常情況下,如果不希望class支援某一特定機能,只要不宣告對應函式就可以了。但是這個策略對copy建構函式和copy assignment操作符卻不起作用。

1、將相應的函式宣告為private函式

編譯器自動構造的函式都是public的,而將相應的函式宣告為private函式,阻止了編譯器暗自建立其專屬版本,也成功阻止人們呼叫它。
然而這種做法並不安全,因為member函式和friend函式還是可以呼叫private函式,此時可以使用“宣告某個函式為private且不實現它”的做法。此時當某人不小心呼叫該函式,將得到一個連線錯誤(link error)。

2、將連線期錯誤提前至編譯期

將copy建構函式和copy assignment操作符宣告為private就可以辦到,但是不是在該類自身,而是在一個專門為了阻止copying動作而設計的base class內。

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

為阻止物件被拷貝,我們唯一需要做的就是繼承Uncopyable class.
但是這種技術可能導致多重繼承,不過通常可以忽略這一點。