欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

《深度探索c++內(nèi)存模型》讀書筆記 (二) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

《深度探索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ì)做兩件工作:

  1. 生成一個(gè)虛函數(shù)表
  2. 為每一個(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ì)

  1. 任何類如不雅沒有定義默認(rèn)構(gòu)造函數(shù),那么就會(huì)被合成出一個(gè)來。
  2. 編譯器合成的默認(rèn)構(gòu)造函數(shù)會(huì)明白設(shè)置覽魴的每一個(gè)數(shù)據(jù)成員初始值。

這兩個(gè)沒有一個(gè)是真的!!!

相關(guān)案例查看更多