1. 程式人生 > 其它 >C++建構函式之委託建構函式

C++建構函式之委託建構函式

文章目錄


前言

C++11新標準允許使用者定義一個委託建構函式,來使用該類的其他建構函式執行自己的初始化過程,這樣做的好處是是可以讓程式碼更簡潔,節省重複的程式碼。


提示:以下是本篇文章正文內容,下面案例可供參考

一、委託建構函式是什麼?

委託建構函式是C++11新允許的一種建構函式型別,區別於普通的建構函式,它可以使用所屬類裡的其他建構函式,類似於功能外包。

二、使用方式

1.函式形式

程式碼如下(示例):

class circle
	{
	public:
		circle(int r,string c):radius(
r),color(c){} circle():circle(5,"red") { cout <<1<< "the radius is" << radius << " " << "the color is" << color << endl; } circle(string c) :circle(5, c) { cout <<2<< "the radius is" <<
radius << " " << "the color is" << color << endl; } circle(istream& is) :circle() { is >> radius >> color; cout << 3 << "the radius is" << radius << " " << "the color is"
<< color << endl; } private: int radius; string color; };

這個示例裡除了第一個建構函式,餘下的三個都委託了他們的工作。
第一個建構函式接受兩個實參,用實參初始化資料成員,它不是委託建構函式。
第二個是我們定義的預設建構函式,它委託第一個雙引數的建構函式完成初始化過程,並且輸出自己的屬性值。
第三個接受一個string實參的建構函式同樣委託給了雙引數的建構函式。
第四個接受istream& 的建構函式也是委託建構函式,它委託給了預設建構函式,預設建構函式又接著委託給了雙引數建構函式。

int main()
{
	circle C1;
	circle C2("green");
	circle C3(cin);
	return 0;
}

我們建立了三個物件,分別是使用了預設建構函式C1和接受一個string的建構函式的C2,以及委託了預設建構函式的C3,為了便於區分,第一次執行我們將遮蔽C3,第二次執行將遮蔽C1,C2,執行結果如下:
這是遮蔽C3的執行結果
我們可以看到,在建立C1時,雙引數的建構函式被呼叫,實現了C1的初始化;建立C2時,雙引數的建構函式同樣被呼叫,完成了C2的初始化。
在這裡插入圖片描述
C3的建立比較特別,我們不止使用了一個委託建構函式
1.接受istream&的建構函式本身就是建構函式,它的初始化工作委託給了預設建構函式
2.預設建構函式本身也是委託建構函式,它又委託給了雙引數的建構函式
我們可以看到,第一行輸出的是預設建構函式的內容,而我們輸入了6和“white”後,實現了C3的初始化,說明委託建構函式多層巢狀時,執行順序遵循棧的方式,最後被呼叫的函式的函式體程式碼最先被執行,然後控制權才會交還給委託者的函式體。

總結

委託建構函式的主要注意點就是它的使用方式和多層巢狀時的函式體執行順序。