二 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).