构造函数调用顺序
構(gòu)造函數(shù)調(diào)用順序:
class B1{public:B1(int i){cout<<"constructing B1"<<i<<endl;}};class B2{public:B2(int j){cout<<"constructing B2"<<j<<endl;}};class B3{public:B3(){cout<<"constructing B3*"<<endl;}};class C: public B2, public B1, public B3{public:C(int a, int b, int c, intd):B1(a),memberB2(d),memberB1(c),B2(b){}private:B1 memberB1;B2 memberB2;B3 memberB3;};void main( ){ C obj(1,2,3,4); }//運(yùn)行后的結(jié)果如下:constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *眾所周知構(gòu)造函數(shù)的執(zhí)行次序如下:
? 調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照他們的繼承時(shí)聲明的順序。
? 調(diào)用內(nèi)嵌成員對(duì)象的構(gòu)造函數(shù),調(diào)用順序按照他們?cè)陬愔新暶鞯捻樞颉?br /> ? 派生類的構(gòu)造函數(shù)體中的內(nèi)容。
? 析構(gòu)函數(shù)的調(diào)用順序相反。
?那么再來看以上的例子就很容易理解了。B2、B1、B3是C的基類,按照上述的順序,我們先要構(gòu)造基類,然后才是子對(duì)象,最后是其本身的構(gòu)造函數(shù)所以先要執(zhí)行這三個(gè)類的構(gòu)造函數(shù)。在構(gòu)造時(shí)按照他們?cè)陬愔械捻樞?#xff0c;首先調(diào)用B2的構(gòu)造函數(shù)
? B2(int j){cout<<"constructing B2"<<j<<endl;}
? 由于在默認(rèn)參數(shù)列表
? C(int a, int b, int c, intd):B1(a),memberB2(d),memberB1(c),B2(b){}
? 中,將b的值傳給了B2的構(gòu)造函數(shù),b為2,故打印出:
? constructing B2 2
? 接下來要構(gòu)造的是B1了。顯然在C的默認(rèn)參數(shù)構(gòu)造列表中將a的值傳給了B1,
? 所以打印出:
? constructing B1 1
? B3在構(gòu)造時(shí)沒有傳遞參數(shù),調(diào)用B3(){cout<<"constructing B3*"<<endl;}
? 打印出:
?cout<<"constructing B3 *
? 這時(shí)基類的構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢,接著該處理內(nèi)嵌成員對(duì)象的構(gòu)造函數(shù)了。
? 我們看到C類有三個(gè)對(duì)象:B1 memberB1;B2 memberB2;B3memberB3;,按照構(gòu)造函數(shù)的調(diào)用順序,我們需要按照他們?cè)陬愔新暶鞯捻樞騺矸謩e構(gòu)造memberB1、memberB2、memberB3。在默認(rèn)的參數(shù)列表中,用c來構(gòu)造了memberB1,用d來構(gòu)造memberB2,
? 故打印出:
? constructing B1 3
? constructing B2 4
? constructing B3 *
? 最后調(diào)用本身的構(gòu)造函數(shù),由于函數(shù)體為空,故什么也沒有打印出來。
? 總結(jié) : 我們必須明確的是當(dāng)一個(gè)類繼承與基類,并且自身還包含有其他類的成員對(duì)象的時(shí)候,構(gòu)造函數(shù)的調(diào)用順序?yàn)?#xff1a;調(diào)用基類的構(gòu)造函數(shù)->調(diào)用成員對(duì)象的構(gòu)造函數(shù)->調(diào)用自身的構(gòu)造函數(shù)。構(gòu)造函數(shù)的調(diào)用次序完全不受構(gòu)造函數(shù)初始化列表的表達(dá)式中的次序影響,與基類的聲明次數(shù)和成員對(duì)象在函數(shù)中的聲明次序有關(guān)。
再如:
#include<iostream.h> class A { protected:char c; public:A(char ch){c=ch;cout<<"c="<<c<<endl;cout<<"類A構(gòu)造函數(shù)被調(diào)用"<<endl;}~A(){cout<<"類A析構(gòu)函數(shù)被調(diào)用"<<endl;} }; class B { protected:int i; public:B(int j){i=j;cout<<"i="<<i<<endl;cout<<"類B構(gòu)造函數(shù)被調(diào)用"<<endl;}~B(){cout<<"類B析構(gòu)函數(shù)被調(diào)用"<<endl;} }; class C:public A,B { private:int k; public:C(char ch,int ii,int kk):A(ch),B(ii),k(kk){cout<<"k="<<k<<endl;cout<<"類C構(gòu)造函數(shù)被調(diào)用"<<endl;}~C(){cout<<"類C析構(gòu)函數(shù)被調(diào)用"<<endl;} }; void main() {C A('B',10,15); } //輸出結(jié)果: c=B 類A構(gòu)造函數(shù)被調(diào)用 i=10 類B構(gòu)造函數(shù)被調(diào)用 k=15 類C構(gòu)造函數(shù)被調(diào)用 類C析構(gòu)函數(shù)被調(diào)用 類B析構(gòu)函數(shù)被調(diào)用 類A析構(gòu)函數(shù)被調(diào)用
總結(jié)
 
                            
                        - 上一篇: 各类项目汇总
- 下一篇: AndroidStudio 跑马灯效果不
