關於初始化列表,父類構造函數以及子類構造函數

問題描述:

    在stackoverflower上發現的一個問題,覺得挺有意思,自己之前也沒有注意到,貼出來分享一下

https://stackoverflow.com/questions/15366621/are-parent-class-constructors-called-before-initializing-variables

 

這裏面的內容實在討論在子類的初始化列表中,如果對子類的成員變量進行初始化,然後調用父類的構造函數,那麼他們的執行順序會是什麼樣的,話不多說,碼來!

#include<iostream>
using namespace std;

class parent {
	int a;
public:
	parent() :a(123) {
		cout << "parent constructor is called\n";
	}
};

class A {
public:
	A(int a) { cout << a<<"A constructor is called\n"; }
};

class son : parent
{
	A a1;
	A a2;
public:
	son() :a1(2),a2(3), parent()
	{
		cout << "son constructor is callede\n";
	}
};

int main() 
{
	
	son s;
	system("pause");
	return 0;
}

運行結果

parent constructor is called
2A constructor is called
3A constructor is called
son constructor is callede

 

分析:雖然按照常理,在初始化列表中,初始化的順序是從左到右的,但是在加入了的構造函數之後,就會先去對父類初始化,這也符合我們的認知,因爲在集成體系中的調用順序就是這樣的,如果我們在子類的構造函數中不顯示的調用父類的構造函數,那麼結果並不會發生變化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章