·委托構造函數
C++11新標准擴展了構造函數初始值的功能,使得我們可以定義所謂的委托構造函數。一個委托構造函數使用它所屬類的其他構造函數執行它自己的初始化過程,或者說它把它自己的一些(或者全部)指責委托給了其他構造函數。
和其他構造函數一樣,一個委托構造函數也有一個成員初始值的列表和一個函數體。在委托構造函數體內,成員初始值列表只有一個唯一的入口,就是類名本身。和其他成員初始值一樣,類名后面緊跟圓括號括起來的參數列表,參數列表必須與類中另外一個構造函數匹配。
舉個例子,我們使用委托構造函數重寫Sales_data類,重寫后的形式如下所示:
class Sales_data{
public:
//非委托構造函數使用對應的實參初始化成員
Sales_data(std::string s,unsigned cnt,double price):bookNo(s),units_sold(cnt),revenue(price*cnt){}
//其余構造函數全都委托給另一個構造函數
Sales_data():Sales_data("",0,0){}
Sales_data(std::string s):Sales_data(s,0,0){}
Sales_data(std::istream &is):Sales_data()
{
read(is,*this);
}
//其他成員與之前的版本一致
};
在這個Sales_data類中,除了一個構造函數外其他的都委托了他們的工作。第一個構造函數接收三個實參,使用這些實參初始化數據成員,然后結束工作。我們定義默認構造函數令其使用三參數的構造函數完成初始化過程,它也無需執行其他任務,這一點從空的構造函數體能看出來。接受一個string的構造函數同樣委托給了三參數的版本。
接收istream&的構造函數也是委托構造函數,它委托給了默認構造函數,默認構造函數又接着委托給三參數構造函數。當這些受委托的構造函數執行完后,接着執行istream&構造函數體的內容。它的構造函數體調用read函數讀取給定的istream。
當一個構造函數委托給另一個構造函數時,受委托的構造函數的初始值列表和函數體被依次執行。在Sales_data類中,受委托的構造函數體恰好是空的。假如函數體包含有代碼的話,將先執行這些代碼,然后控制權才會交還給委托者的函數體。