天天看點

C++11 FAQ中文版:委托構造函數(Delegating constructors)

二 25 Year 2011 陳 良喬 C++11 FAQ

委托構造函數(Delegating constructors)

在C++98中,如果你想讓兩個構造函數完成相似的事情,可以實作兩個完全相同的構造函數,或者是實作一個init()函數,兩個構造函數都調用這個init()函數。例如:

class X {
        int a;
        // 實作一個初始化函數
        validate(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
    public:
        // 三個構造函數都調用初始化函數validate(),完成初始化工作
        X(int x) { validate(x); }
        X() { validate(42); }
        X(string s) { int x = lexical_cast<int>(s); validate(x); }
        // …
    };
           

這樣的實作方式重複羅嗦,并且容易出錯。并且,這兩種方式的可維護性都很差。是以,在C++0x中,我們可以在定義一個構造函數時調用另外一個構造函數:

class X {
        int a;
    public:
        X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
        // 構造函數X()調用構造函數X(int x)
        X() :X{42} { }
        // 構造函數X(string s)調用構造函數X(int x)
        X(string s) :X{lexical_cast<int>(s)} { }
        // …
    };
           

(譯注:在一個構造函數中調用另外一個構造函數,這就是委托的意味,不同的構造函數自己負責處理自己的不同情況,把最基本的構造工作委托給某個基礎構造函數完成,實作分工協作。)

參考:

•    the C++ draft section 12.6.2

•    N1986==06-0056 Herb Sutter and Francis Glassborow: Delegating Constructors (revision 3).

繼續閱讀