|
http://blog.163.com/hbu_lijian/blog/static/12612915320125935016617/
1、如果類里面有成員類,成員類的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2、創(chuàng)建派生類的對象,基類的構(gòu)造函數(shù)函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類里的成員類);
3、 基類構(gòu)造函數(shù)如果有多個(gè)基類則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們在成員初始化表中的順序;
4、成員類對象構(gòu)造函數(shù)如果有多個(gè)成員類對象則構(gòu)造函數(shù)的調(diào)用順序是對象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5、派生類構(gòu)造函數(shù),作為一般規(guī)則派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕悩?gòu)造函數(shù)否則兩個(gè)類的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類的實(shí)現(xiàn)。(基類設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕悩?gòu)造函數(shù))
#include <iostream>
class A; class B;
class A { private: public: A() { std::cout << "A()" << std::endl; } };
class B { private: public: B() { std::cout << "B()" << std::endl; } };
class C:public B { private: A a; public: C() { std::cout << "C()" << std::endl; } };
int main(int argc, char *argv[]) { C c; std::cout << "Application run successfully" << std::endl; return 0; }
輸出結(jié)果: B() A() C()
更改程序如下: #include <iostream>
class A; class B; class C;
class A { private: public: A(C &pC) { std::cout << "A()" << std::endl; } };
class B { private: public: B(void *pB) { std::cout << "B()" << std::endl; } };
class C:public B { private: A a; public: C():B(this),a(*this) { std::cout << "C()" << std::endl; } };
int main(int argc, char *argv[]) { C c; std::cout << "Application run successfully" << std::endl; return 0; } 運(yùn)行結(jié)果: B() A() C()
|