青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

高山流水

----- 要黑就黑徹底

Inside The C++ Object Model 學習筆記 -- The Semantics Of Constructors

2.1 Default Constructor 的構造操作
??? 按照C++ Annotated Reference Manaual 的說法:"Default constructor... 在需要的時候被編譯器產生出來". 這里的關鍵字是:“在需要的時候”。
??? C++ Standard[ISO-C++95]中又有如下的聲明:對于class X, 如果沒有任何user-declared constructor,那么會有一個default constructor 被暗中聲明出來....一個被暗中聲明出來的default constructor 將是一個trival的constructor"。 這里我覺得主要是“user-declared constructor”,它包括用戶所定義的所有的constructor還有其它的一些有virtual關鍵字的操作。這樣下面的四種情況下由編譯器生成的constructor是notrival default constructor:
???
??? 1. 帶有 Default Constructor 的 Member Class Object(帶有缺省構造函數的類成員對象)
??? 如果一個類的帶有一個或多個的類成員對象,而類成員對象又有構造函數,那么就會生成該類就會生成一個notrival default constructor 構造函數。 成員對象的構造函數的調用是按成員對象的聲明順序執行的。例如:

class ?Foo? {? public :?Foo(),?Foo( int )?.?} ;
class ?Bar? {? public :?Foo?foo;? char ? * str;?} ;?
??
void ?foo_bar()
{
???????Bar?bar;?
// ?Bar::foo在這里被初始化(調用Foo的缺省構造行數:?Foo:Foo())
??????
??????
//
????? if ?(str)? {?} ??.?
???}

????
??? 對于有多個成員對象的類,則按成員對象在類的聲明中的順序調用它們的構造函數。
??????
??? 2. 帶有 Default Constructor 的 Base Class(帶有缺省構造函數的基類對象)????? ?指的是一個沒有任何constructorsrs的類派生自一個帶有“default constructor”的基類。 如果類存在多個構造函數的話,那么編譯器也會擴充現有的每一個構造函數,將調用基類的default constructor的代碼加入到其中。
???????
??? 3. 帶有一個 Virtual Function 的 Class
??? 這樣的virtual Function可以使繼承來的或直接定義的。 編譯器在編譯期間會做如下工作
??? a. 生成一個virtual Function talbe(vtbl), 用來存放class 的virtual function的地址
??? b. 在每一個class object中,添加一個額外的pointer member(vptr),它指向class vtbl的地址
???
??? 4. 帶有一個 Virtual Base Class 的 Class
??? 這種情況是在導出類的安插一個virtual base classes的指針,用來在運行時存取virtual base class 的成員。例如:

?1?????class?X?{?public:?int?i;?};?
?2?????class?A?:?public?virtual?X???{?public:?int?j;?};?
?3?????class?B?:?public?virtual?X???{?public:?double?d;?};?
?4?????class?C?:?public?A,?public?B?{?public:?int?k;?};?
?5?
?6?????//?cannot?resolve?location?of?pa->X::i?at?compile-time?
?7?????void?foo(?const?A*?pa?)?{?pa->i?=?1024;?}?
?8?????//?在編譯期可能生成如下形式:
?9?????//?void?foo(const?A*?pa)?{?pa->_vbcX->i?=?1024;?}?//?_vbcX:?virtual?base?class?X
10?????
11?????main()?
12?????{?
13?????????foo(?new?A?);?
14?????????foo(?new?C?);?
15?????
16?????????//??
17?????}
18?
19?

????
??? 注意: 在合成的default constructor中,只有base class subobjects和member class objects會被初始化,其它所有的nostatic data member都不會執行初始化的操作.要我們自己手動的去執行初始化的操作.

??? 其實把握一個原則:要不要合成一個構造函數,依據編譯器的需要與否,合成出來的constructor也只是完成那些編譯器所需求。
???
??? 兩個錯誤的觀點:
?i. 任何時候,如果沒有定義default constructor,就會被合成一個出來。(而是根據編譯器的需要決定是否生成一個deault constructor)
?ii. 編譯器生成出來的default constructor會明確的初始化每類中的每一個data member.


2.2 Copy Constructor的構建操作
??? 有三種情況下會有一個Copy Constructor的操作:
?i.?? 對一個object做明確的初始化操作??// class X{ ....};?? X x;??? X xx = x;
?ii.? 當某個object作為參數傳遞給某個函數??// void foo(X x) { .... }
?iii. 函數傳回一個class object對象??// void foo(){ X xx; return xx;}

??? 1. Default Memberwise Initialization(缺省的按成員初始化)
??? 如果一個類沒有explicit copy constructor時, class object在執行copy constructor時,內部以default member initialization的手法來完成,就是把每一個內建或者派生而來的data member的值從某個object 拷貝一份到另一個object身上,對member class object是以遞歸的方式調用memberwise initialization的。
???
??? 這種初始化是通過在必要時生成一個copy constructor或通過 bitwise copy 來完成的。 如果要通過bitwise來完成這這樣的操作,那么必須表現出bitwise copy semantise.?
???
??? C++ Standard中也把copy constructor分成trial 和notrivial兩種類型,只有notrivial的實體才會被合成于程序中。決定一個copy constructor是否為trivial在于類是否表現出所謂的"Bitwise copy sematics".
???
??? 2. Bitwise Copy Semantics
??? 在 bitwise copy sematics 下,不會構造出一個default copy constructor. 例如:
?

?1????class?Word
?2?????{
?3?????public:?
?4?????????Word(const?char*);
?5?????????~Word(){?delete?[]str;?}
?6?????????//
?7?????private:
?8?????????int?cnt;
?9?????????char?*str;
10?????}??
11?????以上的是一個表現出Bitwise?copy?sematics的類,而以下是一個沒有表現出bitwise?copy?sematics的類
12?????class?Word
13?????{
14?????public:?
15?????????Word(const?char*);
16?????????~Word(){?delete?[]str;?}
17?????????//
18?????private:
19?????????int?cnt;
20?????????String?str;
21?????}
22?????
23?????class?String?
24?????{
25?????public:?
26?????????String(const?char*);
27?????????String(const?string&);?//?String的顯示copy?constructor
28?????????~String();
29?????????//.
30?????}
31?????這種情況下會合成一個copy?constructor以調用class?String?object的copy?constructor.
32?????inline?Word::Word(const?Word&?wd)
33?????{
34?????????str.String::String(wd.str);
35?????????cnt?=?wd.cnt;
36?????}????
37?

???????
??? 3. 不表現出Bitwise Copy Sematics的特性的情況
??? 以下的幾種情況class不表現出 Bitwise Sematics:
??????? a. 當class 內含有一個member object, 而后者的class 聲明有一個copy constructor時(合成或聲明的都可以),就不表現出Bitwise Sematics
??????? b. 當class 繼承自一個base class, 而后者存在有一個copy constructor(合成或聲明的都可以), 就不表現出Bitwise Sematics.
??????? c. 當類聲明了一個或多個virtual function時
??????? d. 當class派生自一個繼承創串鏈,其中有一個或多個virtual base classes時, 類就不表現出Bitwise Sematics
??? 這四種情況和default constructor生成的是否一個trivial是一樣的, 也是滿足編譯器的需求。
??????
??? 4. 重新設定Virtual Table 的指針
??? 對于以上:當類聲明了一個或多個virtual function的情況,程序會為類對象做如下兩個擴張操作:
??????? (1) 增加一個vtbl的指針,內含virtual function的指針地址。
??????? (2) 在類對象內安插一個vptr指針,指向virtual function table.
??? 對于把一個base class object 以其derived class object的值初始化操作的時候,會發生切割(sliced)操作。這時也要保證vtbl的正確和vtpr的正確性。
???
??? 5. 處理Virtual Base Class Subobject
??? 如果一個class object是以另外一個object作為初始值的話,而后者又有一個virtual base class suboject的話,那么也會使bitwise copy sematics失效。例如:

?1?????class?Raccoon?:?public?virtual?ZooAnimal{
?2?????public:
?3???Raccoon(){??;?}
?4???Raccoon(int?val)?{?;?}
?5???private:
?6???//?
?7?????};
?8?
?9?????class?RedPanda?:?public?Raccoon{
10?????public:
11???RedPanda()?{?.;?}
12???RedPanda(int?val)?{?.;?}
13???private:
14???//?
15?????};
16?????執行如下操作時會要求合成一個copy?constructor:
17?????RedPanda?little_red;
18?????Raccoon?little_critter?=?little_re;??//?這里編譯器必須明確的把little_critter的virtual?base?class?pointer/offset初始化。
19?
20?????//?如果只是這樣的操作用bitwise?copy?就可以了
21?????Raccoon?rocky;
22?????Raccoon?little_critter?=?rocky;???//?用簡單的bitwise?copy?就可以搞定了
23?
24?


2.3 程序轉化語義學(Program Transformation Semantics)
?指的是程序在執行的是候要做的類型和操作的轉換。 下面例子反映了三種轉換操作:

?

?1??#include?"X.h"
?2?
?3??X?foo(?X?x0)
?4??{
?5???X?xx;
?6?
?7???//?.,?對xx和x0進行操作
?8?
?9???return?XX;
10??}
11?

?

?1. 明確的初始化操作(Explicit Initialization)
?例如:

1 X?x0
2 ? void ?foo_bar()
3 ? {
4 ??X?x1(x0);
5 ??X?x2? = ?x0;
6 ??X?x3? = ?X(x0);
7 ?}

8

?
?對程序做兩個階段的轉化:
?i. 重寫每一個定義,其中的初始化操作都會被剝除
?ii. 類的Copy constructor操作會被安插進去
?轉化后可能成為這樣的(偽碼):
?這也就是說前面三種的初始化操作都會轉換成Explicit Initialization.

?1??void?foo_bar()
?2??{
?3???X?x1;?
?4???X?x2;
?5???X?x3;
?6?
?7???x1.X::X(x0);
?8???x2.X::X(x0);
?9???x3.X::X(x0);
10??}
11?
12?

?2. 參數的初始化(Argument Initialization)
?例如下面:

?1??void?foo(X?x0){?;?}
?2??void?call()
?3??{
?4???X?xx;
?5?
?6???//?.?xxx?初始化及其操作
?7?
?8???foo(xx);
?9??}
10??轉換后的操作為:
11??void?call()
12??{
13???X?xx;
14?
15???X?__temp0;
16???__temp0.X::X(xx);
17???foo(__temp0);????????????????//?foo?函數應變成:void?foo(X&?x0);
18???__temp0.X::~X();??
19??}
20?
21?

?這就是為什么當傳值到孫數的時候,不會把函數內對傳入值的操作結果不會被修改,因為它在函數內本來修改的就不是外部傳人的那個變量。


?3. 返回值的初始化(Return Value Initialization)
?例如:
?X bar()
?{
??X xx;
??// ....
??return xx;
?}?
?
?轉化為如下偽碼:
?void bar(X& __result)
?{
??X xx;
??xx.X::X();?? // 編譯器生成的一個缺省的構造函數調用

??// 處理 ....

??__result.X::X(xx);??? // 編譯器生成的copy constructor調用操作
??return;
?}
?
?如下的操作轉化為:
?void foo()
?{
??X xx = bar();
?}

?被轉化為:
?void foo()
?{
??X xx;
??bar(xx);?? // 注意這里不用執行 default constructor
?}
?
?針對這種轉換,可以從使用層面上進行優化和在編譯器層面上做優化操作。在編譯器層面上的操作就是采用NRV(Named Return Value)技術。
?如:
?x bar()
?{
??X xx;
??// ....
??return xx;
?}
?優化為:
?void bar(X& __result)
?{
??__result.X::X();

??//....? 直接的處理 __result

??//
??return ;
?}?

2.4 成員初始化隊伍(Member Initialization List)
?這里有兩點要注意:
?1. 以下的四種情況下必須使用 member intialization list
??I.?? 當初始化一個reference member時
??II.? 當初始化一個const member時
??III. 當初始化一個base class 的constructor,而它擁有一組參數時
??IV.? 當調用一個member class的constructor, 而它擁有一組參數時

??其它情況下可以用在構造函數內初始化也可以
?
?2. 關于初始化的次序問題:
??編譯器的初始化的順序是按member聲明次序來依次的初始化的。它會安插一些代碼到構造函數內,并放在任何其它用戶初始化的代碼之前.

?

posted on 2006-10-30 14:33 猩猩 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: C&C++語言

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久999| 欧美成人精品激情在线观看| 国产精品久久久久9999高清 | 亚洲视频精品在线| 欧美色一级片| 欧美在线视频观看| 欧美一级电影久久| 在线免费精品视频| 亚洲精品久久久久| 欧美色123| 久久久精品国产免大香伊| 久久久女女女女999久久| 亚洲国产日韩在线| 亚洲视频电影在线| 精品999在线观看| 亚洲精品国产系列| 国产精品女同互慰在线看| 久久久精品tv| 欧美精品午夜| 新狼窝色av性久久久久久| 久久午夜视频| 亚洲一区二区在线| 久久亚裔精品欧美| 一区二区三区久久精品| 午夜精品免费| 亚洲精品国产精品乱码不99 | 开心色5月久久精品| 欧美成年人网站| 欧美一级视频免费在线观看| 国语自产精品视频在线看8查询8| 性欧美大战久久久久久久久| 性感少妇一区| 亚洲淫性视频| 狠狠色丁香婷综合久久| 亚洲欧洲精品一区| 国产在线观看一区| 一区二区三区高清视频在线观看| 国产一区激情| 一本到高清视频免费精品| 激情欧美一区二区| 一区二区三欧美| 亚洲精品激情| 久久久一区二区| 小嫩嫩精品导航| 欧美日韩成人| 欧美韩日高清| 狠狠色综合色区| 亚洲视频中文字幕| 宅男66日本亚洲欧美视频| 久久久一区二区三区| 久久精品国产精品亚洲综合| 欧美日韩另类一区| 欧美成人一区二区三区| 国内精品久久久久久久果冻传媒| 99riav久久精品riav| 亚洲日本在线观看| 另类亚洲自拍| 理论片一区二区在线| 国产亚洲一区在线播放| 亚洲一区二区av电影| 午夜精品久久久久| 欧美视频一区二区三区| 日韩午夜电影av| 亚洲一区二区视频在线观看| 欧美精品一区二区三区在线看午夜 | 黄色成人免费观看| 午夜精品偷拍| 久久精品五月婷婷| 国产综合欧美| 久久精品一区蜜桃臀影院| 久久先锋资源| 影视先锋久久| 欧美www在线| 亚洲激情视频网站| 一区二区福利| 国产精品福利网| 亚洲欧美在线一区二区| 欧美一级专区免费大片| 国产欧美一区二区三区久久| 久久成人综合网| 女同一区二区| 99视频精品免费观看| 欧美久久综合| 亚洲一区二区在线看| 欧美中文在线字幕| 在线观看国产成人av片| 欧美精品乱人伦久久久久久| 一区二区欧美日韩| 久久久久成人精品| 亚洲国内欧美| 欧美午夜精品一区| 欧美综合国产精品久久丁香| 欧美sm重口味系列视频在线观看| 亚洲精品视频二区| 国产精品久久久久影院色老大 | 欧美有码在线视频| 欧美国产先锋| 亚洲一级网站| 精品成人免费| 欧美色道久久88综合亚洲精品| 午夜欧美视频| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲精品极品| 久久精品理论片| 亚洲人成高清| 国产精品永久在线| 欧美交受高潮1| 欧美一区二区精美| 99天天综合性| 欧美jizz19hd性欧美| 亚洲一区www| 亚洲第一伊人| 国产精品亚洲аv天堂网| 嫩草伊人久久精品少妇av杨幂| 在线亚洲精品福利网址导航| 欧美成人精品福利| 久久精品水蜜桃av综合天堂| 中国女人久久久| 亚洲国产高清一区| 国产亚洲精品久久久久婷婷瑜伽| 欧美第一黄色网| 久久亚洲图片| 午夜精品一区二区三区在线视| 亚洲精品视频一区| 欧美激情自拍| 麻豆精品视频在线观看| 欧美在线|欧美| 亚洲影视在线| 亚洲无人区一区| 在线亚洲激情| 99re成人精品视频| 亚洲精品一区二区三区蜜桃久| 国产综合av| 国产小视频国产精品| 国产精自产拍久久久久久| 国产精品极品美女粉嫩高清在线| 欧美大片一区二区| 欧美xx69| 欧美另类在线观看| 欧美高清在线精品一区| 美女精品视频一区| 蜜臀av一级做a爰片久久| 久久精品夜夜夜夜久久| 久久精品二区| 久久美女性网| 欧美成人xxx| 欧美日韩mp4| 欧美日韩在线第一页| 欧美三级欧美一级| 欧美午夜久久| 国产精品色一区二区三区| 国产精品网红福利| 国产日韩久久| 激情婷婷欧美| 亚洲精品国精品久久99热一| 亚洲精品乱码久久久久久黑人 | 欧美三级视频| 国产精品高清一区二区三区| 国产精品久久久免费| 国产精品视频一区二区高潮| 国产欧美日韩激情| 一区久久精品| 99www免费人成精品| 亚洲一区在线免费| 久久久久久久一区二区| 你懂的一区二区| 日韩视频在线播放| 亚洲欧美视频在线观看| 久久香蕉国产线看观看av| 欧美高清在线| 国产欧美精品va在线观看| 亚洲国产高清一区| 亚洲性图久久| 免费亚洲电影在线| 亚洲欧洲另类国产综合| 亚洲素人一区二区| 久久久久久午夜| 欧美日韩在线高清| 国模私拍一区二区三区| av成人天堂| 老妇喷水一区二区三区| 亚洲精品久久久久久下一站| 亚洲一区二区黄色| 欧美大胆a视频| 国产视频综合在线| 亚洲美女精品成人在线视频| 欧美淫片网站| 亚洲最黄网站| 蜜桃av久久久亚洲精品| 国产啪精品视频| 一本色道久久综合亚洲91| 久久精品国产一区二区三区| 91久久夜色精品国产网站| 欧美一区二区高清| 欧美性猛交xxxx免费看久久久| 亚洲第一福利视频| 久久久久久噜噜噜久久久精品| 亚洲精品久久久久久下一站| 久久久久综合一区二区三区| 国产精品久久久久久久浪潮网站 |