《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
《深度探索C++對象模型》--5構造、析構、拷貝語意學
1、純虛函數:
(1)C++可以定義和調用一個純虛函數,不過只可以靜態調用,不可以由虛擬機制調用。
注意:pure virtual destructor一定得定義,因為每一個derivedclass destructor會被編譯器加以擴張,以靜態方式調用其每一個virtual base class及上一個base class的destructor,如果缺乏任何一個base class destructor的定義就會導致鏈接失敗。
綜上,不要把virtual destructor聲明為pure。
(2)如果一個函數定義內容并不與類型有關,幾乎不會被后續的derived class改寫,則沒有必要聲明為virtual。
(3)virtual函數最好不要加const。
2、“無繼承”情況下的對象構造
(1)Plain OL' Data具有trivialcopy等操作,編譯器實際上不會產生。
(2)explicit initialization list的缺點:
只有當class members都是public,才有效;只能指定常量,因為在編譯期間就可以被評估求值;由于編譯器沒有自動實施,初始化行為的失敗率要高一些。
(3)如果許多函數需要以傳值方式傳回一個local class object,則提供一個copy constructor合理,觸發NRV優化。
3、繼承體系下的對象構造
constructor的執行算法:
在derived class constructor中,所有virtual baseclasses以及上層base class的constructors都會被調用;
上述完成后,對象的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盡可能放置在使用它的那個程序區段附近,以節省不必要的產生對象和銷毀操作。
(2)C++程序中所有的globalobject都被放置在程序的datasegment中(其它的應該是在heap或stack中)。如果明確的給一個值,object將以該值為初值。否則object所配置的內存內容為0。
2、new和delete運算符
(1)語言要求每一次對new的調用都必須傳回一個獨一無二的指針,傳統方法就是傳回一個指針,指向一個默認為1-Byte的內存區塊。
(2)注意,如果用的當一個baseclass指針指向一個derivedclass objects所組成的數組時,delete時只會調用base class的destructor,虛擬機制不起作用,如下:
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;}
(3)placementoperator 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 执行期语意学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《深度探索C++对象模型》--4 Fun
- 下一篇: s3c2440移植MQTT