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

高山流水

----- 要黑就黑徹底

Inside The C++ Object Model 學習筆記--Semantics of Construction, Destructin, and Copy

Chapter 5. Semantics of Construction, Destruction, and Copy

5.1 “無繼承” 情況下的對象構造
1. 普通類型(和C相同)
2. 抽相數據類型
3. 為繼承作準備

5.2 繼承體系下對象的構造
1.? 通用繼承構造規則
???? (1) 在成員初始化列表中的data members初始化操作會被放進constructor的函數本身,并以members的聲明順序為順序。
???? (2) 如果有一個member沒有出現在初始化列表中,但它有一個default constructor,那么default constructor會被調用。
???? (3) 如果class object 有virtual table pointer(s), 它(們)必須被設定初始值,指向適當的virtual table(s)。
???? (4) 在那之前,所有的上一層的base class constructors必須被調用, 以base class的聲明順序為順序
???? (5) 在那之前,所有的virtual base class constructors必須被調用,從左到右,從最深到最淺。

2. 虛擬繼承(virtual Inheritance)
如對于下面的類:?

?1?class?Point3d?:?public?virtual?Point
?2??{?
?3??public:?
?4?????Point3d(?float?x?=?0.0,?float?y?=?0.0,?float?z?=?0.0?)?
?5?????????:?Point(?x,?y?),?_z(?z?)?{}?
?6?????Point3d(?const?Point3d&?rhs?)?
?7?????????:?Point(?rhs?),?_z(?rhs._z?)?{}?
?8?????~Point3d();?
?9?????Point3d&?operator=(?const?Point3d&?);?
10?
11?????virtual?float?z(){?return?_z;?}?
12?????//??
13??protected:?
14?????float?_z;?
15??};?

?
?可能的轉換是這樣的:

?1?//?Psuedo?C++?Code:?
?2??//?Constructor?Augmentation?with?Virtual?Base?class?
?3??Point3d*?Point3d::Point3d(?Point3d?*this,?bool?__most_derived,??float?x,?float?y,?float?z?)?
?4??{?
?5???if?(?__most_derived?!=?false?)?
?6????this->Point::Point(?x,?y);?
?7?
?8???this->__vptr__Point3d?=?__vtbl__Point3d;?
?9???this->__vptr__Point3d__Point?=?__vtbl__Point3d__Point;?
10?
11???this->_z?=?rhs._z;?
12???return?this;?
13??}?

?//
?對于如下的繼承層次:
?class Vertex?? : virtual public Point { ... };
?class Vertex3d : public Point3d, public Vertex { ... };
?class PVertex? : public Vertex3d { ... };

?類Point3d的構造可能是:

?1?//?Psuedo?C++?Code:?
?2??//?Constructor?Augmentation?with?Virtual?Base?class?
?3??Point3d*?Point3d::Point3d(?Point3d?*this,?bool?__most_derived,??float?x,?float?y,?float?z?)?
?4??{?
?5???if?(?__most_derived?!=?false?)?
?6????this->Point::Point(?x,?y);?
?7?
?8???this->__vptr__Point3d?=?__vtbl__Point3d;?
?9???this->__vptr__Point3d__Point?=?__vtbl__Point3d__Point;?
10?
11????this->_z?=?rhs._z;?
12???return?this;?
13??}

?//
?對于Vertex3d的構造可能是如下:

?1?//?Psuedo?C++?Code:?
?2??//?Constructor?Augmentation?with?Virtual?Base?class?
?3??Vertex3d*?Vertex3d::Vertex3d(?Vertex3d?*this,?bool?__most_derived,?float?x,?float?y,?float?z?)?
?4??{?
?5???if?(?__most_derived?!=?false?)?
?6????this->Point::Point(?x,?y);?
?7?
?8???//?invoke?immediate?base?classes,?
?9???//?setting?__most_derived?to?false?
10?
11???this->Point3d::Point3d(?false,?x,?y,?z?);?
12???this->Vertex::Vertex(?false,?x,?y?);?
13?
14???//?set?vptrs?
15???//?insert?user?code?
16?
17???return?this;?
18??}?

?

3. vptr初始化語意學(The Semantics of the vptr Initialization)
???? (1) 構造函數執行算法
????????? I.??? 在derived class constructor 中, 所有的"virtual base classes" 及 "上一層base class"的constructors會被調用.
?? II.? 上述完成之后, 對象的vptr(s)會被初始化, 指向相關的virtual talbe(s).
?? III. 如果有成員初始化列表的話, 將在constructor體內擴展開來. 這必須在vptr被設定之后才能進行,以免有一個virtual member function被調用
?? IV. 最后, 執行程序所提供的代碼.
????
???? (2) 示例:
???? For example, given the following user-defined PVertex constructor:

1?PVertex::PVertex(?float?x,?float?y,?float?z?)?
2?????:?_next(?0?),?Vertex3d(?x,?y,?z?)
3?????,?Point(?x,?y?)?
4??{?
5???if?(?spyOn?)?
6????cerr?<<?"within?Point3d::Point3d()"??<<?"?size:?"?<<?size()?<<?endl;?
7??}?

?

??可能一個擴展如下:

?1?//?Pseudo?C++?Code?
?2??//?expansion?of?PVertex?constructor?
?3??PVertex*?PVertex::PVertex(?Pvertex*?this,??bool?__most_derived,?float?x,?float?y,?float?z?)?
?4??{?
?5???//?conditionally?invoke?the?virtual?base?constructor?
?6???if?(?__most_derived?!=?false?)?
?7????this->Point::Point(?x,?y?);?
?8???//?unconditional?invocation?of?immediate?base?
?9????this->Vertex3d::Vertex3d(?x,?y,?z?);?
10?
11???//?initialize?associated?vptrs?
12?
13???this->__vptr__PVertex?=?__vtbl__PVertex;?
14???this->__vptr__Point__PVertex?=?__vtbl__Point__PVertex;?
15?
16???//?explicit?user?code?
17???if?(?spyOn?)?
18????cerr?<<?"within?Point3d::Point3d()"?
19????<<?"?size:?"?<<?(*this->__vptr__PVertex[?3?].faddr)(this)?
20????<<?endl;?
21?
22???//?return?constructed?object?
23???return?this;?
24??}?

?


5.3 對象的復制(Object Copy Sematics)
1. Copy constructor operator 在以下幾種情況下不會表現出: bitwisecopy
???? (1) class 內帶有一個member object, 而其類有一個copy constructor operator時。
???? (2)? 當一個 class 的base 有一個copy assignment operator時。
???? (3)? 當類聲明了任何一個virtual functions時。
???? (4)? 當class繼承自一個virtual base class時
?2. 合成示例

?1??//?Pseudo?C++?Code:?synthesized?copy?assignment?operator?
?2??inline?Point3d&?Point3d::operator=(?Point3d?*const?this,?const?Point3d?&p?)?
?3??{?
?4???//?invoke?the?base?class?instance?
?5???this->Point::operator=(?p?);?
?6?
?7???//?memberwise?copy?the?derived?class?members?
?8???_z?=?p._z;?
?9???return?*this;?
10??}?

?

5.4 對象的功能


5.5 析構語意學(Semantics of Destruction)
1. 析構函數生成原則:
?如果類沒有定義destructor, 那么只有在class內帶的member object(或是class自己的base class)擁有destructor的情況下,編譯器才會自動的合成一個來。否則,destructor會被視為不需要,也就不需要被合成(當然更不需要被調用)

2. 析構調用過程
???? (1) destructor的函數本身首先被執行。
???? (2) 如果class擁有member class objects, 而后者擁有destructors, 那么它會以其聲明順序的相反順序被調用.
???? (3) 如果object內帶一個vptr, 則現在被重新設定,指向適當的base class的virtual table.
???? (4) 如果任何直接的(上一層)novirtual base classes 擁有destructor,那么它會以其聲明順序相反的順序調用
???? (5) 如果有任何的virtual base classes 擁有destructor, 而當前討論的這個class是最末端的class, 那么它們會以其原來的構造順序相反的順序被調用.

?

posted on 2006-10-30 14:42 猩猩 閱讀(249) 評論(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>
            亚洲国产一区二区在线| 亚洲视频一区| 牛牛国产精品| 美女视频黄免费的久久| 亚洲欧洲精品成人久久奇米网| 蜜桃久久av| 欧美精品日韩一本| 亚洲一区二区在线| 亚洲欧美春色| 永久久久久久| 亚洲九九九在线观看| 国产精品成人午夜| 欧美在线黄色| 欧美.com| 亚洲免费在线视频一区 二区| 午夜精品福利在线观看| 一区二区在线观看视频| 亚洲第一主播视频| 国产精品jvid在线观看蜜臀| 欧美一区二区三区日韩| 蜜臀91精品一区二区三区| 亚洲一区二区欧美日韩| 欧美影院午夜播放| 亚洲麻豆视频| 午夜视频在线观看一区| 亚洲免费观看高清在线观看 | 亚洲乱码久久| 国产欧美一区二区三区另类精品| 蜜桃av一区二区三区| 欧美日韩国产不卡| 久久综合色综合88| 欧美少妇一区| 欧美激情一区二区三级高清视频| 国产精品h在线观看| 欧美成年人视频网站| 国产精品久久久久久久第一福利| 男人天堂欧美日韩| 国产欧美精品一区二区色综合| 欧美黑人多人双交| 国产色婷婷国产综合在线理论片a| 欧美二区视频| 一区二区在线免费观看| 亚洲一区在线播放| 一本色道精品久久一区二区三区 | 久久久精品一品道一区| 亚洲午夜精品一区二区| 欧美不卡视频| 久久人体大胆视频| 国产精品入口麻豆原神| 亚洲免费成人av电影| 亚洲国产欧美一区二区三区同亚洲 | 亚洲一区二区视频在线| 蜜桃伊人久久| 免费成人在线视频网站| 国产欧美不卡| 午夜久久资源| 欧美在线观看网站| 国产精品日韩久久久久| 最新日韩在线视频| 亚洲区第一页| 欧美激情在线| 亚洲毛片网站| 中日韩在线视频| 欧美日韩国产欧| 亚洲人成7777| 一区二区三区日韩精品| 欧美黄色一级视频| 亚洲精品日韩在线观看| 亚洲靠逼com| 欧美成人蜜桃| 亚洲精品免费在线| 一区二区三区国产在线| 欧美日韩不卡| 亚洲深夜激情| 香蕉久久久久久久av网站| 国产精品久久久久91| 午夜精品福利电影| 久久精品成人一区二区三区蜜臀| 国产色产综合色产在线视频| 欧美在线播放视频| 你懂的视频欧美| 一本大道久久a久久精品综合| 欧美日韩国产一区二区三区地区| 亚洲精品乱码久久久久久久久| 这里只有视频精品| 国产精品午夜av在线| 欧美亚洲日本网站| 嫩草成人www欧美| 欧美黄在线观看| 日韩视频在线免费| 欧美日韩一二三四五区| 午夜亚洲视频| 欧美电影在线观看完整版| 亚洲最新视频在线| 国产女主播一区二区三区| 久久午夜电影网| 一本色道久久综合亚洲二区三区 | 亚洲天堂成人| 国产一区二区三区在线播放免费观看 | 在线中文字幕一区| 久久久一区二区三区| 亚洲欧洲精品一区二区精品久久久| 欧美日韩三级| 欧美自拍偷拍午夜视频| 亚洲人成绝费网站色www| 欧美一区二区三区婷婷月色| 亚洲激情女人| 国产免费亚洲高清| 欧美精品v日韩精品v国产精品| 亚洲欧美国产高清va在线播| 亚洲高清免费视频| 久久视频免费观看| 亚洲色图自拍| 亚洲激情影院| 黄色成人91| 国产精品免费看| 欧美精品一卡| 久久亚洲私人国产精品va| 亚洲午夜一区| 99re66热这里只有精品3直播 | 欧美大片免费观看| 欧美在线播放一区二区| 中国女人久久久| 亚洲精品久久久久久久久久久| 国产亚洲毛片在线| 国产精品久久国产精品99gif| 老司机久久99久久精品播放免费 | 亚洲欧美国产视频| 99国产精品99久久久久久| 欧美黑人多人双交| 美女日韩在线中文字幕| 欧美在线三区| 欧美亚洲综合久久| 亚洲一区二区成人在线观看| 亚洲精品国产精品国自产观看| 国产一区在线免费观看| 国产女精品视频网站免费| 欧美少妇一区二区| 国产精品扒开腿爽爽爽视频 | 欧美专区日韩视频| 亚洲欧美在线aaa| 亚洲午夜精品久久久久久浪潮| 亚洲人成毛片在线播放女女| 亚洲电影视频在线| 欧美激情免费观看| 亚洲高清色综合| 亚洲欧洲日韩女同| 亚洲乱码精品一二三四区日韩在线 | 亚洲欧美在线免费| 亚洲欧美日韩另类| 欧美一区二区在线观看| 欧美一区激情视频在线观看| 久久精品国产v日韩v亚洲| 久久精品国产清高在天天线 | 亚洲永久在线| 亚久久调教视频| 久久成人在线| 久久精品国产一区二区电影| 久久国产精品网站| 久久激五月天综合精品| 美日韩精品免费| 欧美日本亚洲韩国国产| 欧美性猛交视频| 国产亚洲综合性久久久影院| 在线播放中文一区| 999在线观看精品免费不卡网站| 亚洲私人影院在线观看| 欧美一区二区三区四区在线| 久久综合久久久久88| 麻豆精品视频在线观看| 亚洲激情视频在线播放| 亚洲小说欧美另类婷婷| 久久国产婷婷国产香蕉| 欧美国产1区2区| 国产日本欧美一区二区| 亚洲国产精品福利| 亚洲视频综合| 久久蜜桃精品| 亚洲欧洲在线免费| 午夜亚洲福利在线老司机| 免费的成人av| 国产精品久久国产愉拍| 精品电影在线观看| 亚洲午夜性刺激影院| 久久人人爽人人爽| 中文亚洲视频在线| 久久久久五月天| 国产精品婷婷| 亚洲区一区二区三区| 久久精品一区四区| 一区二区三区欧美成人| 久久另类ts人妖一区二区| 欧美日韩免费一区| 亚洲风情在线资源站| 欧美一区二区三区在线视频| 亚洲精品九九| 麻豆freexxxx性91精品| 国产日韩av一区二区| 亚洲亚洲精品在线观看| 欧美大片在线看|