深入探索C++對象模型筆記

一開始對C++primer plus都沒看完的是我就下載了深入探索C++對象模型,當時看了就覺得絕望,因爲實在看不懂,天書。不過經過一段時間的使用,尤其是放在Effictive c++後面再來看,就很有感觸了。題主比較健忘,決定把一些關鍵點記錄下來,方便沒時間的時候能夠快速翻閱。

  1. 爲什麼抽象基類必須定義一個純虛函數的析構函數,pure virtual destructor,class設計者一定得定義它,要不然就會導致鏈接失敗?

    因爲每一個派生類的析構函數會被編譯器擴展,以靜態調用的方式調用其“每一個虛基類”以及“上一層基類”的析構函數,因此,只要缺乏任何一個基類的析構函數的定義,就會導致鏈接失敗。C++語言有一個保證:繼承體系中每一個類對象的析構函數都會被調用。

    1. C++的所有全局對象都被當做“初始化過的數據”來對待。
    2. 由於是傳值,把形參拷貝到實參會調用複製構造函數。因此如果允許複製構造函數傳值,那麼會形成永無休止的遞歸併造成棧溢出。因此C++的標準不允許複製構造函數傳值參數,而必須是傳引用或者常量引用。在Visual Studio和GCC中,都將編譯出錯。
    3. 當數組作爲函數的參數進行傳遞時,數組就自動退化爲同類型的指針
    4. 確定缺省參數的值是在編譯的時候,但確定引用、指針的虛函數調用哪個類型的函數是在運行的時候
    5. 不允許拷貝數組,使用數組時通常會將其轉換成指針。
    6. 不要返回局部對象的引用或者指針。
    7. 常量對象,以及常量對象的引用或者指針都只能調用常量成員函數。
    8. 構造函數的任務就是初始化類對象的數據成員,無論何時只要類的對象被創建,就會執行構造函數。
    9. 不允許對一個引用重新賦值,意思就是不能將一個引用重新指向一個新的對象。
    10. 一個類如果沒有派生類,那麼其析構函數就沒必要是虛函數。如果有,那麼就必須定義爲虛函數,理由我們可以分析一下:在繼承關係中,派生類構造對象的過程是首先調用父類構造函數,構造父類的對象成分,包括成員變量,然後才創建派生類的成員。析構函數正好是反過來。但是如果是使用基類對象指針調用基類析構函數時,會只釋放基類的資源,而沒有釋放派生類的資源,這樣的結構會造成內存泄露。
發佈了77 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章