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

構造,析構,拷貝語義學 semantics of construction destruction and copy

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

純虛擬函數是可以定義并調用的,只不過只能被靜態調用,不能經由虛擬機制。(經過試驗vs2008是不可以的)

而pure virtual destructor :class 設計者一定要定義它。因為每一個derived class的destructor會被編譯器加以擴展,以靜態方式調用其每一個virtual base class 以及上層base class 的destructor ,因此缺乏任何一個base class destructor 的定義就會導致連接失敗

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

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的析構函數沒有設置為虛擬的,那么delete a 的時候只有調用了A的析構函數,真正的B并沒有調用。而如果虛擬的話,那么a調用析構函數會調用B的析構函數,而B的析構函數會調用A的析構函數。

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

---------

沒有繼承下的對象構造

Plain OI’s data 形式

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

理論上編譯器會生成沒有用的trival ctor dtor copytor copy operator ,然而事實上什么也沒有發生。

全局對象,c中會被放在bss段,而c++中的全局對象會被視為完全定義,被當做初始化過的數據來對待。

抽象數據類型:

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

經過封裝的Point class 大小沒有改變 由于默認的member wise 賦值語義已經足夠,我們無需提供copy constructor 和copy operator。對于global 實體,Point::Point(0) 會自動調用 (程序開始時候startup())

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

例如 void mumble(){

Point A1={1};

Point A2; A2._x=1;

}

A2的初始化會比A1慢,因為,當activation record(活動記錄 是不是棧中的pc 指針),上述的list中常量就可以放進A1的內存中了

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

Point *heap = new Point;

翻譯為:

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

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

`````

為繼承準備:

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 都是數值,因此默認語義下情況良好。virtual destructor 也沒有引入啊,同樣道理,行為良好即可

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

定義的構造函數被附加了一些代碼,用來初始化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;

}

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

因為bitwise的賦值可能會帶給vptr 錯誤

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

繼承體系下的對象構造:

如果定義 T object 會發生什么

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

2.如果一個member沒有出現在 list 中但他有default constructor ,他必須被調用

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

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

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

如果base class 不再列表,有默認ctor 調用

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

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

如果base class 列于 初始化列表中,參數被傳遞如果base class 不再列表,有默認ctor 調用

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

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

虛擬繼承

虛擬繼承比較具有特殊性,因為他具有共享性。在這樣一個繼承體系中

image 

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

事實上我們發現,只有當object 是完整object時才會調用共享部分的ctor ,而部分subobject不會調用,從而得到新的策略,提供兩種構造函數一種供完整的object 一種供subobject調用

 

~~~~vptr 初始化語義學~~~

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

ctor 調用順序是從根源到末端,從內而外。當base class ctor 執行時候 derived實體還沒有構造出來,在pvertex 構造完整之前,pvertex并不是一個完整的對象,因此只有Point3d subobject構造完畢,這意味著每一個pvertex base class ctor 調用時候,編譯器必須保證有適當的 size 函數實體來調用 how,so 決議為自己的size

另一種方法是控制vptr,

在base class ctor 調用之后,但是在程序員提供代碼或者initial list 之前,我們設定vptr ,也就是說我們保證vptr指向剛剛構造完畢的base clas subobject 對應的vtable ,保證了它能夠調用正確的virtual func;

所以對象構造是這樣的過程:

一個 PVertex對象會先形成一個 Point對象- >Point3d->Vertex->Vertex3d->PVertex

ctor執行算法:

1.derived class ctor 中所有 virtual base class 和上一級base class 調用

2. 上述完成vptr 初始化,指向相應的vtable

3.如果有member initial list 的haunted,將在ctor 展開,這些必須在vptr 設定后進行,防止有virtual func 調用

4.最后執行程序員寫的代碼

vptr 需要被設定的兩種情況:

1.對象完整定義后

2.當一個subobject ctor 調用了一個虛擬函數時候(上面說的很明白嘍)

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

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

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

對象復制語義學 object copy semantics

我們有三種選擇:

1 什么都不做,按默認行為實施

2 提供一個explicit copy assignment operator

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

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

1.class 有一個member object 而他有copy operator

2.class的base class 有一個copy operator

3.當class 聲明virtual func時 (由于要設定vptr when derived to base)

4.class 繼承自 virtual base class

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

··········析構語義學semantics of Destruction

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

dtor 調用順序是這樣的:

1 dtor  函數本身執行,

2 如果class 擁有member class object 而后者擁有dtor 那么他們會以相反的順序被調用

3 如果object 帶有vptr ,現在被重新設定,指向適當的base class vtble

4 如果任意直接的nonvirtual base class 有dtor ,他們會以聲明的相反順序調用

5 如果任意virtual base class 有destructor ,而當前討論的這個class 是最低端的most –derived class 那么他們會以原來的構造順序相反順序調用

 

一個object 的生命周期結束于dtor 開始執行時,由于每一個base class dtor 輪番調用,所以一個derived object 實際上變成了一個個完整的objec ;一如 PVertex->Vertex3d->Vertex->Point3d->Point

對象的蛻變會因為vptr 重新設定受到影響(dtor中,程序員代碼之前),在程序中施行dtor的真正語義會在下一章具體表述~~

#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--------------------------------------------------------

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲欧美综合国产精品一区| 亚洲欧美日韩精品久久奇米色影视 | 久久久久久久久久久久久女国产乱| 9国产精品视频| 亚洲精品欧美一区二区三区| 日韩午夜免费| 午夜精品免费在线| 亚洲专区在线| 久久美女性网| 亚洲国产综合视频在线观看| 欧美激情女人20p| 一个色综合av| 久久久久国产一区二区三区| 欧美大片一区二区| 国产精品日韩在线播放| 伊人成年综合电影网| 亚洲精品视频一区| 午夜一区二区三区不卡视频| 久久综合九色| 一本色道久久加勒比88综合| 欧美影视一区| 欧美日韩1区2区| 国模大胆一区二区三区| 99国产精品国产精品久久 | 国产亚洲美州欧州综合国| 在线观看日韩www视频免费| 日韩视频精品在线| 久久久久九九九九| 在线亚洲观看| 欧美黄色影院| 影音先锋日韩精品| 欧美一区2区视频在线观看 | 亚洲欧美激情四射在线日| 麻豆乱码国产一区二区三区| 国产精品xxxxx| 亚洲免费一级电影| 欧美精品在线免费播放| 精品福利av| 亚洲女同精品视频| 91久久精品久久国产性色也91| 亚洲综合国产精品| 欧美午夜不卡影院在线观看完整版免费| 国精品一区二区| 欧美在线观看你懂的| 99国产精品久久久久久久成人热| 久久国产手机看片| 国产欧美精品一区| 性高湖久久久久久久久| 99riav久久精品riav| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲少妇中出一区| 国产亚洲成av人片在线观看桃 | 99re6热在线精品视频播放速度| 久久大香伊蕉在人线观看热2| 欧美日韩成人精品| 99国产麻豆精品| 亚洲精品人人| 欧美日本免费一区二区三区| 亚洲欧洲另类| 亚洲精品国产精品国产自| 蜜桃久久精品一区二区| 亚洲国产高清高潮精品美女| 麻豆av福利av久久av| 久久视频在线看| 亚洲电影免费在线| 亚洲国产美女| 欧美丝袜一区二区| 欧美一区二区久久久| 午夜精品99久久免费| 国产欧美 在线欧美| 欧美在线黄色| 久久精精品视频| 亚洲动漫精品| 亚洲精品欧美激情| 国产精品美女久久久免费| 欧美一区二区三区在线视频| 亚洲欧美精品在线| 极品av少妇一区二区| 亚洲国产第一页| 欧美视频网站| 久久久精品国产99久久精品芒果| 久久精品成人| 艳妇臀荡乳欲伦亚洲一区| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久久久电影| 久久精品91久久久久久再现| 老司机一区二区三区| 一区二区三区偷拍| 欧美在线一二三区| 夜夜爽99久久国产综合精品女不卡 | 国产亚洲人成a一在线v站| 欧美jizz19性欧美| 欧美欧美天天天天操| 久久成人亚洲| 欧美成人自拍视频| 欧美影院午夜播放| 欧美激情一区二区三区四区| 午夜精品久久久久影视| 开元免费观看欧美电视剧网站| 夜夜嗨一区二区| 久久精品一区二区三区四区 | 欧美一区二区三区男人的天堂| 亚洲一区二区三区乱码aⅴ| 亚洲高清久久| 免费在线看成人av| 午夜亚洲福利在线老司机| 久久一区二区精品| 亚洲欧美一区二区激情| 欧美国产高清| 久久嫩草精品久久久精品| 欧美日韩伦理在线| 欧美激情第六页| 韩日欧美一区| 在线视频亚洲欧美| 亚洲免费电影在线观看| 久久九九99视频| 欧美亚洲日本国产| 欧美区一区二区三区| 欧美成人综合| 在线日韩av片| 久久精选视频| 久热精品视频在线| 国产日韩一区| 午夜精品福利视频| 欧美夜福利tv在线| 国产精品毛片a∨一区二区三区|国| 亚洲黄页一区| 亚洲美洲欧洲综合国产一区| 麻豆成人在线| 欧美国产日本| 亚洲国产一区在线| 久久尤物视频| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品午夜av在线| 在线一区免费观看| 性欧美xxxx大乳国产app| 国产精品女人网站| 欧美一区1区三区3区公司| 久久成人免费电影| 韩国av一区二区| 久久夜色精品国产| 欧美激情国产日韩精品一区18| 伊人激情综合| 模特精品在线| 9人人澡人人爽人人精品| 亚洲午夜国产一区99re久久| 国产精品h在线观看| 午夜国产不卡在线观看视频| 久久久精彩视频| 在线免费不卡视频| 欧美日韩精品久久| 亚洲小说欧美另类婷婷| 久久大综合网| 91久久夜色精品国产网站| 欧美激情一区二区久久久| 亚洲视频欧美在线| 久久久久久一区| 亚洲美女福利视频网站| 国产精品a久久久久| 欧美在线不卡视频| 91久久久久久| 久久国产黑丝| 亚洲精品孕妇| 国产精品推荐精品| 久久天天躁狠狠躁夜夜av| 日韩视频在线观看| 久久国产主播精品| 久久久美女艺术照精彩视频福利播放| 久久综合狠狠综合久久激情| 日韩亚洲欧美中文三级| 国产精品美女久久久| 老司机精品福利视频| 99精品国产热久久91蜜凸| 亚洲一级片在线观看| 久久人人爽人人| 在线中文字幕一区| 国产亚洲在线| 欧美手机在线| 久久婷婷国产麻豆91天堂| 日韩一二三区视频| 农夫在线精品视频免费观看| 国产精品99久久不卡二区| 一区精品在线播放| 国产精品啊啊啊| 毛片基地黄久久久久久天堂| 一区二区三区欧美激情| 亚洲二区视频| 蜜臀91精品一区二区三区| 欧美一级黄色网| 亚洲伊人伊色伊影伊综合网 | 好吊妞**欧美| 国产精品国产自产拍高清av| 麻豆精品精品国产自在97香蕉| 一区二区欧美在线观看| 欧美黄色日本| 欧美va亚洲va香蕉在线| 久久精品亚洲乱码伦伦中文| 亚洲私人影院在线观看| 91久久国产综合久久| 在线免费观看成人网|