C++11特性——委托構造函數(Delegating constructors)


 

轉載自:https://www.chenlq.net/books/cpp11-faq/cpp11-faq-chinese-version-series-delegate-constructors.html

 

委托構造函數(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).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM