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

構(gòu)造,析構(gòu),拷貝語義學(xué) semantics of construction destruction and copy

純虛擬函數(shù)的存在(Presence of a Pure Virtual Function)

純虛擬函數(shù)是可以定義并調(diào)用的,只不過只能被靜態(tài)調(diào)用,不能經(jīng)由虛擬機(jī)制。(經(jīng)過試驗(yàn)vs2008是不可以的)

而pure virtual destructor :class 設(shè)計(jì)者一定要定義它。因?yàn)槊恳粋€(gè)derived class的destructor會(huì)被編譯器加以擴(kuò)展,以靜態(tài)方式調(diào)用其每一個(gè)virtual base class 以及上層base class 的destructor ,因此缺乏任何一個(gè)base class destructor 的定義就會(huì)導(dǎo)致連接失敗

基類的析構(gòu)函數(shù)應(yīng)該設(shè)置為虛擬的,不一定是純虛的 ,除非在希望將一個(gè)類變成抽象類(不能實(shí)例化的類),而這個(gè)類又沒有合適的函數(shù)可以被純虛化的時(shí)候,可以使用純虛的析構(gòu)函數(shù)來達(dá)到目的。

class A{ public: char* pChar;A(){pChar=new char[20];};~A(){delete []pChar;}};

class B:public A{ public: char* pChar;B(){pChar=new char[20];}~B(){delete []pChar;}};

int main(){ A* a = new B; delete a;}

如上,如果A的析構(gòu)函數(shù)沒有設(shè)置為虛擬的,那么delete a 的時(shí)候只有調(diào)用了A的析構(gòu)函數(shù),真正的B并沒有調(diào)用。而如果虛擬的話,那么a調(diào)用析構(gòu)函數(shù)會(huì)調(diào)用B的析構(gòu)函數(shù),而B的析構(gòu)函數(shù)會(huì)調(diào)用A的析構(gòu)函數(shù)。

虛擬函數(shù)的取舍:如果一個(gè)函數(shù)被設(shè)計(jì)為虛擬函數(shù),但是他函數(shù)定義并不與類型相關(guān),也就是說繼承類改寫他的幾率很低,那么這是個(gè)糟糕的事情。如果不是虛擬而且能內(nèi)聯(lián),這是個(gè)很大的損失

---------

沒有繼承下的對(duì)象構(gòu)造

Plain OI’s data 形式

例如 struct {float x,y,z;}

理論上編譯器會(huì)生成沒有用的trival ctor dtor copytor copy operator ,然而事實(shí)上什么也沒有發(fā)生。

全局對(duì)象,c中會(huì)被放在bss段,而c++中的全局對(duì)象會(huì)被視為完全定義,被當(dāng)做初始化過的數(shù)據(jù)來對(duì)待。

抽象數(shù)據(jù)類型:

class Point {public: Point (float x=0):_x(x){}; private: _x;}

經(jīng)過封裝的Point class 大小沒有改變 由于默認(rèn)的member wise 賦值語義已經(jīng)足夠,我們無需提供copy constructor 和copy operator。對(duì)于global 實(shí)體,Point::Point(0) 會(huì)自動(dòng)調(diào)用 (程序開始時(shí)候startup())

如果要對(duì)class所有成員都設(shè)定常量初值,那么給予一個(gè)explicit initial list 會(huì)比較高效。

例如 void mumble(){

Point A1={1};

Point A2; A2._x=1;

}

A2的初始化會(huì)比A1慢,因?yàn)椋?dāng)activation record(活動(dòng)記錄 是不是棧中的pc 指針),上述的list中常量就可以放進(jìn)A1的內(nèi)存中了

explicit initialzation list (A1的那種)缺點(diǎn):public 才可以;只能指定常量;

Point *heap = new Point;

翻譯為:

Point *heap = __new(sizeof(Point));

if(heap)heap->Point::Point();

`````

為繼承準(zhǔn)備:

class Point{
public:
    Point(float x=0.,float y=0.):_x(x),_y(y){}
    virtual float z();
protected:
    float _x,_y;
};

這里并沒有定義copy constructor ,copy operator,我們所有member 都是數(shù)值,因此默認(rèn)語義下情況良好。virtual destructor 也沒有引入啊,同樣道理,行為良好即可

virtual func 的引入給我們的 Point class 帶來了膨脹作用:

定義的構(gòu)造函數(shù)被附加了一些代碼,用來初始化vptr 這些代碼附加在任何base 初始化之后,任何程序員代碼之前。例如:

Point* Point::Point(Point* this,float x,float y):_x(x),_y(y){

  this->_vptr_Point=_vtbl_Point; this->_x=x;this->_y=y; return this;

}

合成一個(gè)copy constructor 和一個(gè) copy operator 而且他們也不再是trival

因?yàn)閎itwise的賦值可能會(huì)帶給vptr 錯(cuò)誤

···············

繼承體系下的對(duì)象構(gòu)造:

如果定義 T object 會(huì)發(fā)生什么

1.member initialization list 中的data number 初始化操作會(huì)放到ctor 中并以聲明順序排列

2.如果一個(gè)member沒有出現(xiàn)在 list 中但他有default constructor ,他必須被調(diào)用

3.在那之前,如果class object有vptr 那么他必須設(shè)定初值指向正確vtable

4.在那之前,任何上一層base class ctor 必須被調(diào)用,以base class 聲明順序,

如果base class 列于 初始化列表中,參數(shù)被傳遞

如果base class 不再列表,有默認(rèn)ctor 調(diào)用

如果base class 是多重繼承下 第二或者后繼的base class this 指針調(diào)整

5.在那之前virtual base class ctor 必須被調(diào)用 從左至右,由深到淺

如果base class 列于 初始化列表中,參數(shù)被傳遞如果base class 不再列表,有默認(rèn)ctor 調(diào)用

base class subobject 的offset 必須在執(zhí)行期可以被存取

··························

虛擬繼承

虛擬繼承比較具有特殊性,因?yàn)樗哂泄蚕硇浴T谶@樣一個(gè)繼承體系中

image 

Point 3d 和Vertex 虛擬繼承自Point  ,此時(shí)如果按照普通的ctor 規(guī)則。Vertex 的ctor 必須調(diào)用Point 的ctor ,然而 當(dāng)  Point3d 和 Vertex 同為Vertex3d的subobject時(shí),他們的調(diào)用一定不能發(fā)生(this指針的調(diào)整問題) ,而只能有 Vertex3d才可以調(diào)用,同樣,PVertex構(gòu)造時(shí)候只能由他自己調(diào)用,也就是說只有底層的class 完成構(gòu)建共享的subobject構(gòu)造。我們可以用一個(gè)most _derived參數(shù)傳給各個(gè)構(gòu)造函數(shù)以指示其是否調(diào)用共享部分的ctor。

事實(shí)上我們發(fā)現(xiàn),只有當(dāng)object 是完整object時(shí)才會(huì)調(diào)用共享部分的ctor ,而部分subobject不會(huì)調(diào)用,從而得到新的策略,提供兩種構(gòu)造函數(shù)一種供完整的object 一種供subobject調(diào)用

 

~~~~vptr 初始化語義學(xué)~~~

c++語言告訴我們:在Point3d ctor 調(diào)用size函數(shù),必須決議為 point3d  的size 而不是 pvertex的size,可以理解為在ctor和dtor 中虛函數(shù)決議為自己的函數(shù),他不虛啦~~~~~(實(shí)際上是因?yàn)樗麤]有變身完全)

ctor 調(diào)用順序是從根源到末端,從內(nèi)而外。當(dāng)base class ctor 執(zhí)行時(shí)候 derived實(shí)體還沒有構(gòu)造出來,在pvertex 構(gòu)造完整之前,pvertex并不是一個(gè)完整的對(duì)象,因此只有Point3d subobject構(gòu)造完畢,這意味著每一個(gè)pvertex base class ctor 調(diào)用時(shí)候,編譯器必須保證有適當(dāng)?shù)?size 函數(shù)實(shí)體來調(diào)用 how,so 決議為自己的size

另一種方法是控制vptr,

在base class ctor 調(diào)用之后,但是在程序員提供代碼或者initial list 之前,我們?cè)O(shè)定vptr ,也就是說我們保證vptr指向剛剛構(gòu)造完畢的base clas subobject 對(duì)應(yīng)的vtable ,保證了它能夠調(diào)用正確的virtual func;

所以對(duì)象構(gòu)造是這樣的過程:

一個(gè) PVertex對(duì)象會(huì)先形成一個(gè) Point對(duì)象- >Point3d->Vertex->Vertex3d->PVertex

ctor執(zhí)行算法:

1.derived class ctor 中所有 virtual base class 和上一級(jí)base class 調(diào)用

2. 上述完成vptr 初始化,指向相應(yīng)的vtable

3.如果有member initial list 的haunted,將在ctor 展開,這些必須在vptr 設(shè)定后進(jìn)行,防止有virtual func 調(diào)用

4.最后執(zhí)行程序員寫的代碼

vptr 需要被設(shè)定的兩種情況:

1.對(duì)象完整定義后

2.當(dāng)一個(gè)subobject ctor 調(diào)用了一個(gè)虛擬函數(shù)時(shí)候(上面說的很明白嘍)

當(dāng)聲明一個(gè)PVertex對(duì)象時(shí)候,由于我們對(duì)base class ctor 的定義,其vptr 不需要每一個(gè)base class ctor 中設(shè)定,因此我們可以把ctor 分解成兩部分,一種完整的object  實(shí)體,一種subobject實(shí)體,subobject實(shí)體中vptr 設(shè)定可以是省略

如果在class ctor initiallist 調(diào)用該class 虛擬函數(shù)安全么? 理論上安全,但是如果依賴未初始化member 不安全

``````````````````

對(duì)象復(fù)制語義學(xué) object copy semantics

我們有三種選擇:

1 什么都不做,按默認(rèn)行為實(shí)施

2 提供一個(gè)explicit copy assignment operator

3 明確拒絕把一個(gè)class object 指定給一個(gè)class object (聲明一個(gè)private 的copy assignment operator)

下列情況下,class 不表現(xiàn)出bitwise 的復(fù)制語義,也就是說默認(rèn)的copy operator 是不夠的:(和之前介紹的一樣)

1.class 有一個(gè)member object 而他有copy operator

2.class的base class 有一個(gè)copy operator

3.當(dāng)class 聲明virtual func時(shí) (由于要設(shè)定vptr when derived to base)

4.class 繼承自 virtual base class

同樣在這里也面臨ctor 中的問題(虛擬繼承時(shí)),最底層的class 必須調(diào)用共享的base class的copy operator,一種策略是,并不壓制上面的class 調(diào)用自己的copy operator ,也就是說允許了 共享部分的多重復(fù)制。另外一種方法是不要允許virtual base class 的copy 操作,甚至不要再任何virtual base class 中聲明數(shù)據(jù)~

··········析構(gòu)語義學(xué)semantics of Destruction

如果class 沒有定義dtor 那么只有class 內(nèi)帶的member object 或者自己的base class 有dtor 時(shí)候,編譯器才會(huì)合成一個(gè)來,否則dtor 被視為不需要了~~~(有virtual func 也不一定需要的)

dtor 調(diào)用順序是這樣的:

1 dtor  函數(shù)本身執(zhí)行,

2 如果class 擁有member class object 而后者擁有dtor 那么他們會(huì)以相反的順序被調(diào)用

3 如果object 帶有vptr ,現(xiàn)在被重新設(shè)定,指向適當(dāng)?shù)腷ase class vtble

4 如果任意直接的nonvirtual base class 有dtor ,他們會(huì)以聲明的相反順序調(diào)用

5 如果任意virtual base class 有destructor ,而當(dāng)前討論的這個(gè)class 是最低端的most –derived class 那么他們會(huì)以原來的構(gòu)造順序相反順序調(diào)用

 

一個(gè)object 的生命周期結(jié)束于dtor 開始執(zhí)行時(shí),由于每一個(gè)base class dtor 輪番調(diào)用,所以一個(gè)derived object 實(shí)際上變成了一個(gè)個(gè)完整的objec ;一如 PVertex->Vertex3d->Vertex->Point3d->Point

對(duì)象的蛻變會(huì)因?yàn)関ptr 重新設(shè)定受到影響(dtor中,程序員代碼之前),在程序中施行dtor的真正語義會(huì)在下一章具體表述~~

#include <time.h>
#include <iostream> 
using namespace std;  
class memberclass{
public: 
     memberclass(){cout<<"memberclass default ctor"<<endl;}
    memberclass(int x){cout<<"memberclass ctor with parameter"<<endl;}
    ~memberclass(){cout<<"memberclass dtor"<<endl;}
};
class Point{public: Point(){cout<<"point ctor"<<endl;test();}
~Point(){cout<<"point dtor"<<endl;test();}
virtual void test(){cout<<"point test"<<endl;}
};
class Point3d:virtual public Point{public: Point3d(){cout<<"Point3d ctor"<<endl;test();}
~Point3d(){cout<<"Point3d dtor"<<endl;test();}
virtual void test(){cout<<"Point3d test"<<endl;}};
class vertex:virtual public Point{public: vertex(){cout<<"vertex ctor"<<endl;test();}
~vertex(){cout<<"vertex dtor"<<endl;test();}
virtual void test(){cout<<"vertex test"<<endl;}
};
class vertex3d:public Point3d ,public vertex{public: 
memberclass inside;
vertex3d(){cout<<"vertex3d ctor"<<endl;test();}
~vertex3d(){cout<<"vertex3d dtor"<<endl;test();}
virtual void test(){cout<<"vertex3d test"<<endl;}
};
class pvertex:public vertex3d{public: 
memberclass inside;
pvertex():inside(3){cout<<"pvertex ctor"<<endl;test();}
~pvertex(){cout<<"pvertex dtor"<<endl;test();}
virtual void test(){cout<<"pvertex test"<<endl;}
};
int main(){ 
    pvertex* p = new pvertex;
    delete p;
    return 0;
}
輸出: guess it ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

point ctor
point test
Point3d ctor
Point3d test
vertex ctor
vertex test
memberclass default ctor
vertex3d ctor
vertex3d test
memberclass ctor with parameter
pvertex ctor
pvertex test
pvertex dtor
pvertex test
memberclass dtor
vertex3d dtor
vertex3d test
memberclass dtor
vertex dtor
vertex test
Point3d dtor
Point3d test
point dtor
point test

 

---------------------------------------------------OVER--------------------------------------------------------

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜在线精品偷拍| 欧美激情精品久久久久久久变态| 亚洲图片欧美日产| 一本一本久久| 欧美一区二区精品久久911| 亚洲香蕉成视频在线观看| 亚洲尤物精选| 欧美综合国产精品久久丁香| 久久琪琪电影院| 亚洲国产老妈| 亚洲精品五月天| 亚洲一区二区三区精品在线| 欧美一级欧美一级在线播放| 久久免费视频这里只有精品| 欧美激情日韩| 国产欧美视频一区二区| 有码中文亚洲精品| 亚洲午夜视频| 美女国产一区| 亚洲一级黄色片| 美国十次成人| 国产精品色一区二区三区| 在线观看成人网| 亚洲制服av| 欧美激情按摩在线| 亚洲女同同性videoxma| 欧美激情第二页| 国内精品99| 亚洲视频大全| 欧美成人a视频| 亚洲一区二区三区在线看 | 亚洲一区成人| 欧美11—12娇小xxxx| 亚洲一区二区久久| 国产精品99久久久久久人 | 欧美美女日韩| 国产一区自拍视频| 亚洲一区二区三区精品视频| 免费中文日韩| 欧美亚洲在线观看| 国产精品第一区| 99伊人成综合| 欧美二区在线观看| 久久精品欧美日韩精品| 国产伦精品一区二区三区高清| 亚洲免费观看在线观看| 麻豆精品网站| 久久精品一二三区| 国产一区二区久久久| 亚洲一区二区三区免费观看 | 亚洲激情在线观看| 麻豆精品91| 在线观看视频免费一区二区三区| 久久久久久久久久看片| 亚洲欧美日韩综合国产aⅴ| 欧美婷婷在线| 亚洲影视综合| 亚洲综合精品| 国产精品综合色区在线观看| 亚洲欧美激情视频| 一本色道**综合亚洲精品蜜桃冫 | 99国产精品久久| 欧美日韩国产123| 一区二区三区视频在线播放| 亚洲激情午夜| 欧美视频精品一区| 亚洲欧美偷拍卡通变态| 亚洲一区在线免费| 国产午夜精品视频| 欧美xx69| 亚洲午夜三级在线| 国产精品嫩草久久久久| 欧美亚洲视频在线看网址| 亚洲午夜在线观看| 国产综合欧美在线看| 美女网站久久| 欧美va亚洲va香蕉在线| 一区二区三区产品免费精品久久75| 日韩视频一区二区| 国产欧美一区二区三区沐欲| 久久综合综合久久综合| 牛夜精品久久久久久久99黑人 | 久久久精品一区| 最新日韩中文字幕| 在线视频亚洲| 精品999日本| 夜夜嗨av一区二区三区免费区| 亚洲伊人观看| 亚洲午夜免费福利视频| 国内精品久久久久久久影视麻豆 | 老巨人导航500精品| 欧美—级a级欧美特级ar全黄| 亚洲午夜国产一区99re久久| 久久国产婷婷国产香蕉| 99国产成+人+综合+亚洲欧美| 亚洲在线观看免费| 亚洲精品亚洲人成人网| 午夜精品影院| 一区二区免费看| 久久夜色撩人精品| 亚洲一区美女视频在线观看免费| 欧美一区视频| 亚洲一卡久久| 欧美大片在线影院| 欧美在线观看网址综合| 欧美区二区三区| 美女国产精品| 国产女主播一区| 亚洲精品久久久一区二区三区| 国产一级精品aaaaa看| 在线视频你懂得一区| 亚洲日本黄色| 久久久久国产精品厨房| 午夜精品成人在线| 欧美人在线视频| 亚洲国产精品悠悠久久琪琪| 国产一区二区三区久久 | 玖玖视频精品| 欧美中文字幕精品| 国产精品久久久久久久久借妻| 亚洲激情一区| 91久久精品网| 毛片精品免费在线观看| 蜜臀av在线播放一区二区三区| 国产免费成人| 亚洲欧美另类在线| 小黄鸭精品aⅴ导航网站入口| 欧美久久在线| 亚洲免费久久| 亚洲图片欧美午夜| 欧美系列电影免费观看| 日韩午夜免费| 亚洲一二三区在线| 国产精品久久久久久久久久久久久久 | 亚洲人成久久| 亚洲国产片色| 老司机精品视频一区二区三区| 久久精品99国产精品| 国产欧美精品xxxx另类| 欧美一区不卡| 裸体一区二区| 亚洲欧洲在线视频| 欧美99在线视频观看| 欧美性一区二区| 中国av一区| 久久国产精品色婷婷| 国产一区二区三区四区三区四| 亚洲一区在线观看免费观看电影高清| 亚洲免费中文| 好吊视频一区二区三区四区 | 久久亚洲精品视频| 亚洲高清一区二| 亚洲视频精品| 国产欧美一区二区三区国产幕精品 | 亚洲精品欧美极品| 欧美日韩国产成人高清视频| 亚洲午夜久久久| 久久综合五月天婷婷伊人| 日韩视频在线播放| 国产精品麻豆欧美日韩ww| 久久精品国产精品| 91久久综合| 久久精品视频导航| 日韩视频第一页| 国产视频欧美视频| 欧美激情二区三区| 亚洲伊人伊色伊影伊综合网| 美国十次成人| 亚洲一区二区三区四区五区午夜 | 久久久精品999| 亚洲美女电影在线| 久久综合电影一区| 亚洲影院在线| 亚洲欧洲久久| 国产精品一区二区久久精品| 久久国产精品一区二区| 亚洲精品日韩久久| 久久一区激情| 亚洲欧美影音先锋| 亚洲激情视频在线播放| 国产日韩精品在线| 欧美日韩一区二区三区在线视频| 午夜一区二区三区在线观看| 最新日韩在线视频| 蜜桃av噜噜一区| 欧美一区2区三区4区公司二百| 亚洲毛片在线| 亚洲国产91| 韩国欧美一区| 国产麻豆成人精品| 国产精品久久久久久妇女6080| 欧美国产欧美综合| 可以看av的网站久久看| 欧美在线国产精品| 亚洲一区二区成人| 一本色道久久综合| 亚洲精品综合精品自拍| 亚洲电影免费观看高清完整版在线| 久久成人久久爱| 亚洲欧美日本另类|