1. 程式人生 > >C++學習筆記之三

C++學習筆記之三

() 利用 在一起 忘記 構造函數 end 會同 筆記 允許

9.3.3
為何所有的析構函數都應該聲明為 virtual 的?
如果使用delete刪去一個實際指向派生類的基類指針,析構函數調用鏈就被破壞。這導致後面使用parent 的指針訪問child 對象並刪去對象時,就會出問題。
( 需要深入理解,為什麽?)
9.3.4
向上轉換:
Super mySuper = mySub;// SLICE; // 會截斷;
Super & mySUper = mySub; // OK, 不會截斷
因此,向上轉換的時候,需要使用指針或者引用

向下轉換:dynamic_cast , 因為它可以使用對象內建的類型信息,拒絕沒有意義的類型轉換。如果轉換失敗,這個指針的值就是nullptr; 如果針對對象引用的dynamic_cast 失敗,將拋出std::bad_cast 異常。

C++中,重寫可以讓子類的成員返回子類的對象的指針或者引用,它和父類中對應的函數是重載的;

如果需要載子類中利用父類的構造函數,可以用類似下面的using關鍵字去實現:
using Super::someMethod; // Explicitly inherits the Super version

為類避免改變類基類的虛函數,而忘記修改類對應的函數繼承鏈條上的子類中的函數,可以載實現重現函數的後面加上 “override” 關鍵字,這樣就可以在編譯截斷就發現問題。

Typid:這個運算可以在運行時查詢對象,從而判斷對象的類型;
Dynamic_cast 不能在沒有虛方法的類上使用;
析構函數一定要是虛函數,否則可能導致子類的資源無法釋放;

如何實現virtual
編譯的時候,如果某個類中有虛函數,就需要創建vtable,這個表中包含類指向虛方法實現的指針。

10.1

10.1.1
關於引用
放在類型後:
只能初始化一次,指向被引用的對象:
聲明的時候初始化;
調用的時候被改變值;

作為參數:
避免復制參數的所有內容;
可以直接修改引用指向的內容;

作為返回值:
避免值拷貝;
返回的不是臨時值,可以連續用返回值連續調用或者給返回值賦值;

(用返回左值引用的函數初始化一個新對象,和用移動拷貝或構造函數基於右值去初始化一個對象的效率是一樣高的,都沒有拷貝)
10.1.2
constexpr 關鍵字
編譯器必須在編譯期間對constexpr函數求值,因此不允許有任何副作用。下面是幾個限制:

函數體就是一個 return 語句;
返回類型應該是字面量類型,返回值不能是void;
函數的所有參數都應該是字面量類型;

*右值引用
STL中的swap()很多是基於右值引用實現的,(自己寫一個)
對於返回(使用)右值引用的函數需要加上 noexpect

11.1 IO流
檢查流的狀態:
good():
bad():
fail():
tell():
Seekg(): 移到輸入流指定偏移的位置;
Seekp(): 移到輸出流指定偏移的位置;

\n 僅僅開始一個新行,而endl 還會刷新緩沖區;
如果需要把類的內部信息都輸出,可以重載《輸出符號;

流的兩種經典使用方法:
方式一:將不同文件的流連在一起
ifstream inFile(“input.txt”);
ofstream outFile(“output.txt”);
inFile.tie(&outFile);
outFile << “Hello “;
string nextToken;
inFIle >> nextToken;
註意:此時讀inFile的時候,因為關聯寫入的“Hello”才能從cache中刷出;
引用:從cin 讀入數據的時候,cout會同步輸出;

方式二:同時實現雙向IO
fstream 類;
fstream ioData(inFIleNmae.c_str());

C++學習筆記之三