日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

發布時間:2025/3/21 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


《深度探索C++對象模型》--5構造、析構、拷貝語意學

1、純虛函數:

1C++可以定義和調用一個純虛函數,不過只可以靜態調用,不可以由虛擬機制調用。

注意:pure virtual destructor一定得定義,因為每一個derivedclass destructor會被編譯器加以擴張,以靜態方式調用其每一個virtual base class及上一個base classdestructor,如果缺乏任何一個base class destructor的定義就會導致鏈接失敗。

綜上,不要把virtual destructor聲明為pure

2)如果一個函數定義內容并不與類型有關,幾乎不會被后續的derived class改寫,則沒有必要聲明為virtual

3virtual函數最好不要加const

2、“無繼承”情況下的對象構造

1Plain OL' Data具有trivialcopy等操作,編譯器實際上不會產生。

2explicit initialization list的缺點:

只有當class members都是public,才有效;只能指定常量,因為在編譯期間就可以被評估求值;由于編譯器沒有自動實施,初始化行為的失敗率要高一些。

3如果許多函數需要以傳值方式傳回一個local class object,則提供一個copy constructor合理,觸發NRV優化。

3、繼承體系下的對象構造

constructor的執行算法:

derived class constructor中,所有virtual baseclasses以及上層base classconstructors都會被調用;

上述完成后,對象的vptr被初始化,指向相關的virtual table

如果有member initialization list的話,將在constructor體內擴展開來。這必須在vptr被設定之后才做,以免有一個virtual member function被調用;

最后執行體內所提供的代碼。

4、對象復制語意學

1)只有在默認行為不安全或者不正確時,才設計一個copy assignmentoperator。可能自己提供一個,來打開NRV優化。

2盡可能地不要允許一個virtualbase class的拷貝操作。建議不要在任何virtual base class中聲明數據。

5、析構語意學

析構過程與constructor順序相反。

?

《深度探索C++對象模型》--6執行期語意學

C++的困難之一,就是不容易從代碼看出來表達式的復雜,一個類似if(yy == xx.getValue())的簡單式子,有可能經歷操作符重載,轉換運算符-if(yy.operator == ( xx.getValue.operator Y() ));這些都由編譯器暗中進行。

1、對象的構造和析構

1)把object盡可能放置在使用它的那個程序區段附近,以節省不必要的產生對象和銷毀操作。

2C++程序中所有的globalobject都被放置在程序的datasegment中(其它的應該是在heapstack)。如果明確的給一個值,object將以該值為初值。否則object所配置的內存內容為0

2newdelete運算符

1)語言要求每一次對new的調用都必須傳回一個獨一無二的指針,傳統方法就是傳回一個指針,指向一個默認為1-Byte的內存區塊。

2)注意,如果用的當一個baseclass指針指向一個derivedclass objects所組成的數組時,delete時只會調用base classdestructor,虛擬機制不起作用,如下:

Point * pointer = new Point3d[10];delete [ ] pointer;//此時調用的是Point::~Point()

如果必須這樣做的話必須迭代走過整個數組,把delete實施于每一個元素上,如此才會調用virtual,如下:

for ( int ix=0; ix < elem_count; ++ix ){Point3d *p = &( (Point3d*) ptr ) [ ix ];delete p;}

3placementoperator new的語意

Point2w*pt2 = new(arena)Point2w;

其中arena指向內存中的一個區塊,用以放置新產生出來的Point2w object

placementoperator new的價值在于它所擴充的另一半是將Point2wconstructor自動調用于arena所指的地址上。注意placement operator new并不支持多態,如Point2s*ptw = new (arena)Point3w;將會導致嚴重的破壞。

3、臨時性對象

1)臨時性對象的被摧毀,應該是對完整表達式求值過程中最后的一步。該完整表達式造成臨時對象的產生。

2)凡持有表達式執行結果的臨時性對象,應該存留到object的初始化操作完成為止。

3)如果一個臨時對象被綁定于一個reference,對象將殘留,知道初始化之reference的聲明結束,或者直到臨時對象的聲明范疇結束。

總結

以上是生活随笔為你收集整理的《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。