轉載自: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).