知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
《深度探索c++內(nèi)存模型》讀書筆記 (二)
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):26
文┞仿目次
- 媒介
- 默認(rèn)構(gòu)造函數(shù)
- 帶有默認(rèn)構(gòu)造函數(shù)的類對(duì)象成員
- 帶默認(rèn)構(gòu)造函數(shù)的基類
- 帶有虛函數(shù)的類
- 總結(jié)
媒介
c++ 編譯器會(huì)在人意想不到的處所做一些隱式操作。例如,只含有一個(gè)參數(shù)的構(gòu)造函數(shù),會(huì)被當(dāng)做類型轉(zhuǎn)換運(yùn)算符。而關(guān)鍵字explict就是為了阻攔這一機(jī)制。
默認(rèn)構(gòu)造函數(shù)
c++ 編譯器會(huì)在須要的時(shí)刻主動(dòng)生成默認(rèn)構(gòu)造函數(shù)。
帶有默認(rèn)構(gòu)造函數(shù)的類對(duì)象成員
如不雅一個(gè)類沒有任何的構(gòu)造函數(shù),然則它有一個(gè)對(duì)象成員,這個(gè)對(duì)象成員有一個(gè)默認(rèn)構(gòu)造函數(shù)。那么編譯器將會(huì)為這個(gè)類生成一個(gè)默認(rèn)構(gòu)造函數(shù)。然則這個(gè)生成的機(jī)會(huì)會(huì)是在這個(gè)類被調(diào)用的時(shí)刻。
如不雅有兩個(gè)文件中都調(diào)用了這個(gè)類,那么默認(rèn)構(gòu)造函數(shù)將可能會(huì)被生成兩次。若何避免這種沖突呢?解決辦法是把合成的構(gòu)造函數(shù)內(nèi)聯(lián)(inline, 一個(gè)內(nèi)聯(lián)函數(shù)有靜態(tài)鏈接 static linkage)。如不雅構(gòu)造函數(shù)太復(fù)雜,不合適內(nèi)聯(lián),那么就匯合成一個(gè)顯式的非內(nèi)聯(lián)靜態(tài)實(shí)體(explicit noinline static)。
例如:
class Foo {
public:
Foo()
};
class Bar {
Foo foo;
char *str;
};
// 編譯器將會(huì)為Bar合成默認(rèn)構(gòu)造函數(shù),初始化foo成員。然則并不會(huì)初始化str成員!!!
如不雅一個(gè)類Foo有本身定義的構(gòu)造函數(shù)(默認(rèn)的,或者帶有參數(shù)的),并且這個(gè)類還有一個(gè)或者多個(gè)類成員。那么編譯器將會(huì)包管這些類成員的構(gòu)造函數(shù)在Foo的構(gòu)造函數(shù)中至少被調(diào)用一次。這些成員的構(gòu)冒昧序與它們?cè)赾lass中的聲明次序一致。
帶默認(rèn)構(gòu)造函數(shù)的基類
類似的,如不雅一個(gè)沒有構(gòu)造函數(shù)的派生類持續(xù)自一個(gè)帶有默認(rèn)構(gòu)造函數(shù)的基類。那么編譯器將會(huì)為這個(gè)派生類生成默認(rèn)構(gòu)造函數(shù)。在這個(gè)生成的構(gòu)造函數(shù)中按照聲明的次序調(diào)用基類的構(gòu)造函數(shù)。
如不雅派生類有構(gòu)造函數(shù),然則沒有默認(rèn)構(gòu)造函數(shù)。編譯器將會(huì)為現(xiàn)有的構(gòu)造函數(shù)中安插調(diào)用基類構(gòu)造函數(shù)的代碼,然則并不會(huì)生成一個(gè)新的默認(rèn)構(gòu)造函數(shù)。
如不雅這個(gè)派生類同時(shí)有類成員(這些類成員有默認(rèn)構(gòu)造函數(shù))。那么編譯器將會(huì)在基類構(gòu)造函數(shù)的代碼后面安插調(diào)用數(shù)據(jù)成員構(gòu)造函數(shù)的代碼。
帶有虛函數(shù)的類
有以下兩種情況會(huì)生成默認(rèn)構(gòu)造函數(shù)
- 類聲明或者持續(xù)一個(gè)虛函數(shù)
- 類派生自一個(gè)持續(xù)串鏈,個(gè)中有一個(gè)或者更多的虛基類(virtual base class)
在編譯時(shí)代,編譯器會(huì)做兩件工作:
- 生成一個(gè)虛函數(shù)表
- 為每一個(gè)對(duì)象添加一個(gè)額外的虛函數(shù)表指針。
對(duì)于類所定義的每一個(gè)構(gòu)造函數(shù),編譯器將會(huì)安插一些代碼,為虛表指針賦初值。帶有一個(gè)虛基類的類編譯器會(huì)矢荷瑣虛基類在派生類中的地位 在履行時(shí)代所決定??
例如
class X{public: int i};
class A :public virtual X {public: int j;};
class B :public virtual X {public: double d;};
class C :public A, public B {public: int k;};
?
// 無法在編譯時(shí)代決定i的地位(偏移?)
void foo(const A *pa) {
pa->i = 1024;
}
?
int main ()
{
foo (new C);
foo (new A);
...
}
編譯器的一種可能的實(shí)現(xiàn)方法為:
在每一個(gè)派生類的虛基類中安插一個(gè)指針。經(jīng)由引用或者指帳攀來存取一個(gè)虛基類的功能都可以由這個(gè)指帳攀來實(shí)現(xiàn)。
例如:
// 可能的轉(zhuǎn)換操作
void foo(const A *pa) {
pa->__vbcX->i = 1024;
}
總結(jié)
在編譯器合成的默認(rèn)構(gòu)造函數(shù)中,會(huì)為那些有默認(rèn)構(gòu)造函數(shù)的成員或者基類調(diào)用其默認(rèn)構(gòu)造函數(shù)。而那些其他的風(fēng)靜態(tài)數(shù)據(jù)成員,例如整數(shù),指針等都不會(huì)被初始化,須要類的設(shè)計(jì)者(就是法度榜樣員了)來做這些操作。
新手一般會(huì)有兩個(gè)誤會(huì):
- 任何類如不雅沒有定義默認(rèn)構(gòu)造函數(shù),那么就會(huì)被合成出一個(gè)來。
- 編譯器合成的默認(rèn)構(gòu)造函數(shù)會(huì)明白設(shè)置覽魴的每一個(gè)數(shù)據(jù)成員初始值。
這兩個(gè)沒有一個(gè)是真的!!!
相關(guān)案例查看更多
相關(guān)閱讀
- 花農(nóng)小程序
- uniapp開發(fā)小程序
- 分銷系統(tǒng)
- 軟件定制
- 昆明小程序代建
- 昆明軟件公司
- 網(wǎng)站建設(shè)服務(wù)公司
- 表單
- 紅河小程序開發(fā)
- 云南小程序開發(fā)制作
- 開發(fā)制作小程序
- 云南網(wǎng)絡(luò)營銷
- 云南網(wǎng)站建設(shè)招商
- 報(bào)廢車回收管理軟件
- 云南網(wǎng)站建設(shè)外包
- 網(wǎng)站建設(shè)報(bào)價(jià)
- 網(wǎng)站建設(shè)快速優(yōu)化
- 小程序生成海報(bào)
- 云南網(wǎng)站建設(shè)公司地址
- 云南小程序開發(fā)首選品牌
- 云南旅游網(wǎng)站建設(shè)
- 網(wǎng)絡(luò)公司排名
- 小程序模板開發(fā)公司
- 軟件定制公司
- 百度人工排名
- 人口普查小程序
- 云南建站公司
- 報(bào)廢車
- 云南網(wǎng)站開發(fā)哪家好
- 微分銷