C++物件模型學習筆記7 站在物件模型的尖端
- {P310} C++被吹毛求疵的一點是:它缺乏一個保證安全的downcast。只有在型別真的可以被適當轉換的情況下,你才能夠執行downcast。一個type-safe downcast必須在執行期對指標有所查詢,查檢視它是否指向它所展現(表達)之object的真正型別。
- 危險在於,如果一個父類指標原本指向的是一個父類物件,被強轉後子類指標後,其實它不擁有一些子類的資料或行為,此時當成子類指標來用就不完全了。
- 欲支援此機制的話,在空間和時間上都需要額外的負擔:
- 需要額外的空間儲存型別資訊(type info),通常是一個指標,指向某個型別資訊節點。
- 需要額外的時間以決定執行期的型別(runtime type)。
- {P310} 對於那些大量使用多型的程式來說,需要正統而合法的大量downcast操作;而內建資料型別或者非多型型別,不應該受各種額外負擔帶來的不良後果。一個策略是新增新的關鍵字,區別那些支援多型的子型別,但缺點必須修改程式。另一種策略是通過宣告一個或者多個virt function來區別,優點通過將指向類相關的執行時資訊的指標存入虛擬函式表,可以大大降低額外負擔。
相關推薦
C++物件模型學習筆記7 站在物件模型的尖端
{P310} C++被吹毛求疵的一點是:它缺乏一個保證安全的downcast。只有在型別真的可以被適當轉換的情況下,你才能夠執行downcast。一個type-safe downcast必須在執行期對指標有所查詢,查檢視它是否指向它所展現(表達)之object的真正型別。 危險在於,如果一個父類指標原本指向
【C語言】學習筆記7——指針與多維數組
一個 聲明 %d mage 分享圖片 技術分享 pan 最好 include 1. 聲明一個指向多維數組的指針 int (* pz) [2]; //pz指向一個內涵兩個int類型元素的數組 int * pax[2]; //pax 是一個內含兩個指針元素的
C++反彙編學習筆記7——陣列和指標以及他們的定址
兩年前寫的,歡迎大家吐槽! 轉載請註明出處。 1. 陣列在函式內 先通過一個簡單的例子來看一下陣列和普通變數在初始化時的不同之處: 這是陣列初始化: 42: int nArry[5] = {1, 2, 3, 4, 5}; 0042B758 mov
C++基礎教程面向物件(學習筆記(84))
移動建構函式並移動賦值 在前面智慧指標和移動語義的介紹中,我們看了一下std :: auto_ptr,討論了移動語義,並看了一下在為複製語義設計的函式時出現的一些缺點(複製建構函式)和複製賦值運算子被重新定義以實現移動語義。 在本課中,我們將深入研究C ++ 11如何通過移動建構函式
C++基礎教程面向物件(學習筆記(83))
R值參考 我們需要了解l值和r值,然後告訴你不要太擔心它們。這是C ++ 11之前的建議。但是理解C ++ 11中的移動語義需要重新審視該主題。所以我們現在就這樣做。 L值和r值 儘管名稱中包含“值”一詞,但l值和r值實際上不是值的屬性,而是表示式的屬性。 C ++中的每個表
C++基礎教程面向物件(學習筆記(104))
字串的流類 到目前為止,您所看到的所有I / O示例都是寫入cout或從cin讀取。但是,還有另一組類稱為字串的流類,允許您使用熟悉的插入(<<)和提取(>>)運算子來處理字串。與istream和ostream一樣,字串流提供了一個緩衝區來儲存資料。但是,與cin
C++基礎教程面向物件(學習筆記(103))
使用ostream和ios輸出 在本節中,我們將介紹iostream輸出類(ostream)的各個方面。 注意:本課程中的所有I / O功能都位於std名稱空間中。這意味著所有I / O物件和函式都必須以“std ::”為字首,或者必須使用“using namespace std;”
C++基礎教程面向物件(學習筆記1)
歡迎使用面向物件程式設計: 首先你應該看一下變數,初始化和賦值,我們在C ++中將物件定義為“可用於儲存值的一塊記憶體”。具有名稱的物件稱為變數。 在傳統的程式設計中(我們在此之前一直在做的),程式基本上是計算機的指令列表,它們定義資料(通過物件),然後使用該資
C++基礎教程面向物件(學習筆記2)
1.1類和類成員 前面發了兩篇似乎是無關緊要的,但是我希望還是可以看看,畢竟介紹了我們接下來要學的內容以及我的一些中肯的建議。 雖然C ++提供了許多基本資料型別(例如char,int,long,float,double等等),這些型別通常足以解決相對簡單的問
C++基礎教程面向物件(學習筆記5(1))
建構函式初始化列表 在上一課中的學習過程中,為簡單起見,我們使用賦值運算子在建構函式中初始化了類成員資料。例如: class Something { private: int m_value1; double m_value2; char
C++基礎教程面向物件(學習筆記5(2))
非靜態成員初始化 在編寫具有多個建構函式的類(大多數建構函式)時,必須為每個建構函式中的所有成員指定預設值會導致冗餘程式碼。如果更新成員的預設值,則需要觸控每個建構函式。 從C ++ 11開始,可以直接為普通類成員變數(不使用static關鍵字的變數)提供預設初
C++基礎教程面向物件(學習筆記6)
重疊和委託建構函式 具有重疊功能的建構函式 例項化新物件時,C ++編譯器會隱式呼叫該物件的建構函式。具有多個具有重疊功能的建構函式的類並不罕見。考慮以下類: class Foo { public: Foo() { // 程式碼A
C++基礎教程面向物件(學習筆記(6))
解構函式 一個解構函式是另一個特殊的類的成員函式,這個函式只有在類的一個物件被銷燬時執行。建構函式旨在初始化類,而解構函式旨在幫助清理累的物件。 當物件正常超出範圍,或者使用delete關鍵字顯式刪除動態分配的物件時,會自動呼叫類解構函式(如果存在),以便在從記
C++基礎教程面向物件(學習筆記(13))
友元函式和類 在本章的大部分內容中,我們一直在傳播保護資料私密性的優點。但是,您可能偶爾會發現一些情況,您會發現在這些類之外需要緊密協作的類和函式。例如,您可能有一個儲存資料的類,以及一個在螢幕上顯示資料的函式(或另一個類)。雖然儲存類和顯示程式碼已經分開以便於
C++基礎教程面向物件(學習筆記(15))
類中的巢狀型別 考慮以下簡短程式: #include <iostream> enum FruitType { APPLE, BANANA, CHERRY }; class Fruit { private: FruitType m_ty
C++基礎教程面向物件(學習筆記(17))
綜合測驗 在本章中,我們探討了C ++的本質 - 面向物件程式設計!這是教程系列中最重要的一章。 總結 類允許您建立自己的資料型別,這些資料型別捆綁了處理該資料的資料和函式。類中的資料和函式稱為成員。通過使用選擇該類的成員。運算子(或者 - >如果您通過指
C++基礎教程面向物件(學習筆記(18))
運算子過載簡介 您在前面學習了函式過載,它提供了一種具有相同名稱的多個函式的函式呼叫的建立和解析機制,只要每個函式都有一個唯一的函式原型。這允許您建立函式體以使用不同的資料型別,而無需為每個函式體考慮唯一的名稱。 在C ++中,運算子是作為函式實現的。通過在運算
C++基礎教程面向物件(學習筆記(24))
過載比較運算子 過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。 因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。 這是一個帶有過載運算子==和operator!=的Car類的示例。 #incl
C++基礎教程面向物件(學習筆記(27))
過載下標運算子 使用陣列時,我們通常使用下標運算子([])來索引陣列的特定元素: myArray[0] = 7; // 將值7放在陣列的第一個元素中 但是,請考慮以下IntList類,該類具有作為陣列的成員變數: class IntList { private
C++基礎教程面向物件(學習筆記(29))
拷貝建構函式 重新初始化型別 由於我們將在接下來的幾節課中談論很多初始化,讓我們首先回顧一下C ++支援的初始化型別:直接初始化,統一初始化或拷貝初始化。 以下是使用我們的Fraction類的所有示例: #include <cassert> #inc