c++構造執行順序:
一、先執行靜態成員的建構函式,如果靜態成員只是在類定義中宣告了,而沒有實現,是不用構造的。必須初始化後才執行其建構函式。
二、任何抽象基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)
三、任何虛擬基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)
四、任何非虛擬基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)
五、任何成員物件的建構函式按照它們宣告的順序構造
六、類自己的建構函式
注意:建構函式的執行順序與初始化列表中的申明順序無關,因為建構函式有多個,析構函式只有乙個,析構順序與構造順序相反,析構的唯一性就限制了構造順序的唯一性,故只能和繼承順序或申明的順序來構造。
測試**:
#include #include "../common/common.h"
using namespace std;
class cbase
~cbase()
u32 m_base_id;
};class cbasea : virtual public cbase
~cbasea()
u32 m_basea_id;
};class cbaseb : virtual public cbase
~cbaseb()
u32 m_baseb_id;
};class cderived : public cbasea, public cbaseb/*, public cbase*/ /* 若採用虛繼承,則不能再重複繼承cbase,否則編譯報錯*/
~cderived()
u32 m_derived_id;
};int main(int argc, char* argv)
測試結果:
cbase create, id = 0
cbasea create, a id = 1
cbaseb create, b id = 2
cderived create, derived id = 1
>>>>>>>>>>>>>>>> 1
cderived destroy, derived id = 1
cbaseb destroy, b id = 2
cbasea destroy, a id = 1
cbase destroy, id = 0
測試結果說明,若採用虛繼承,只會構造一次cbase。
c 類構造順序
include using namespace std class a 結果和分析 a 1 父類a的建構函式 a 2 父類b中a的建構函式 a 3 父類b中成員變數b初始化 呼叫父類a的建構函式 b 4 父類b中成員變數b初始化 呼叫父類b的建構函式 a 5 c中成員變數b 的構造ab a 6 c中...
c 類構造順序
include using namespace std class a 結果和分析 a 1 父類a的建構函式 a 2 父類b中a的建構函式 a 3 父類b中成員變數b初始化 呼叫父類a的建構函式 b 4 父類b中成員變數b初始化 呼叫父類b的建構函式 a 5 c中成員變數b 的構造ab a 6 c中...
C 物件構造順序
程式裡不可能只有乙個物件,我們的程式裡處處都是物件,那麼物件的構造順序是怎麼樣的呢。還是按照在記憶體四區上的分布來分開說,此處不在說 段。如果物件是在棧上分配的,那麼肯定是在函式中建立的,只要main函式開始執行,就有了程式執行流,所以分配在棧上的物件的構造順序是按照順序執行流和物件的定義語句來確定...