深度探索C++ 对象模型(3)-默认构造函数Default Constructor
生活随笔
收集整理的這篇文章主要介紹了
深度探索C++ 对象模型(3)-默认构造函数Default Constructor
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. Default Constructor只對base class subobjects和member class objects初始化,對data member不做操作
2. 編譯器構(gòu)造Default Constructor 只在下面4種case:
- 1.包含有帶默認(rèn)構(gòu)造函數(shù)的對象成員的類 .
- 2.繼承自帶有默認(rèn)構(gòu)造函數(shù)的基類的類 .
- 3.有虛函數(shù)的類(需要初始化每一個class object的vptr) .
- 4.有一個虛基類的類
本文主要針對"包含有帶默認(rèn)構(gòu)造函數(shù)的對象成員的類"
class Foo {public:Foo() { cout << "Foo Constructor" << endl; } Foo(int) { }};void test_defaultConstructor(){cout << "begin" << endl;Bar bar;cout << "end" << endl;}(1). 若無定義構(gòu)造函數(shù)
class Bar { private: Foo foo; };編譯器的對類Bar的Default Constructor為
Bar::Bar(){foo.Foo::Foo();//調(diào)用Foo的構(gòu)造函數(shù)來初始化foo對象 }運(yùn)行測試代碼,輸出結(jié)果為:
begin
Foo Constructor
end
(2). 若有構(gòu)造函數(shù)
Bar::Bar() {cout << "Bar default code" << endl; }此時編譯器擴(kuò)展已知構(gòu)造函數(shù):
Bar::Bar(){foo.Foo::Foo();//調(diào)用Foo的構(gòu)造函數(shù)來初始化foo對象cout << "Bar default code" << endl; }運(yùn)行測試代碼,輸出結(jié)果為:
begin
Foo Constructor
Bar default code
end
(3). 若有多個class member objects都要求constructor初始化,將按照在classs中的聲明次序調(diào)用
class Dopey {public:Dopey() {cout << "Dopey Constructor" << endl;}};class Sneezy {public:Sneezy() {cout << "Sneezy Constructor" << endl;}};class Bashful {public:Bashful() {cout << "Bashful Constructor" << endl;}};class Snow_White { private:Dopey dopey;Sneezy sneezy;Bashful bashful;int mumble; };void test_defaultConstructor(){cout << "begin" << endl;Snow_White obj;cout << "end" << endl;}運(yùn)行測試代碼,輸出結(jié)果為:
begin
Dopey Constructor
Sneezy Constructor
Bashful Constructor
end
(4). 如果基類有默認(rèn)構(gòu)造函數(shù),又有一個成員有默認(rèn)構(gòu)造函數(shù),那么順序是誰先呢?
class SnowWhite : public Dopey{ private: Sneezy sneezy; };void test_defaultConstructor_ObjectOrder(){cout << "begin" << endl;SnowWhite obj;cout << "end" << endl;}運(yùn)行測試代碼,輸出結(jié)果為:
begin
Dopey Constructor
Sneezy Constructor
end
【引用】
[1]<<深度探索C++ 對象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 譯
[2] 代碼地址 https://github.com/thefistlei/cplusStudy.git
總結(jié)
以上是生活随笔為你收集整理的深度探索C++ 对象模型(3)-默认构造函数Default Constructor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度探索C++ 对象模型(2)-类的对象
- 下一篇: 深度探索C++ 对象模型(3)-默认构造