從零開始的C (虛析構與IO流)

2021-09-26 09:08:44 字數 2192 閱讀 2704

什麼是虛函表,在c++的類中,一旦成員函式中有虛函式,這個類中就會多乙個虛函式表指標,這個指標指向乙個虛函式表,表裡面記錄了這個類中所有的虛函式,當這個類被繼承,他的子類也會有乙個虛函式表,如果子類的成員函式中有函式簽名與父類中的虛函式一樣就會用子類中的函式替換它在虛函式表中的位置,這樣就達到了覆蓋的效果

當通過類指標或引用呼叫函式時,會根據物件中實際的虛函式表記錄來呼叫函式,這樣就達到了多型的效果。

不管子類有沒有虛函式,只要父類中有虛函式,子類繼承後中也會有虛函式表

當使用 delete 釋放乙個父類指標時,不管實際指向的物件是子類還是父類都只會呼叫父類的析構函式(多型肯定會出現的問題)

如果子類的析構函式有需要負責釋放的記憶體,就會造成記憶體洩露

為了解決這個問題,可以把父類的析構函式設定為虛函式,析構函式進行覆蓋是不會比較函式名。

當父類的析構函式為虛函式時,通過父類指標或引用釋放子類物件時,會自動呼叫子類的析構函式,子類的析構函式執行完成後也會呼叫父類的析構函式。

注意:析構函式可以是虛函式,但建構函式不可以。

注意:c++中為了相容c(語言),目標型別源型別 依然可以繼續使用,但c語言的強制型別轉換安全性差,因此建議使用c++中的強制型別轉換

注意:c++之父認為如果**設計的完善,根本不需要用到強制型別轉換,而c++的強制型別轉換之所以設計的很複雜,是為了讓程式設計師多關注**本身設計,盡量少使用。

c++中的強制型別轉換保證沒有很大的安全隱患

static_cast《目標型別》(源型別) 編譯器會對源型別和目標型別做相容性檢查,不通過則錯

dynamic_cast《目標型別》(源型別) 編譯器會對源型別和目標類是否同為指標或引用,並且存在多型型的繼承關係

const_cast《目標型別》(源型別) 編譯器會對源型別和目標類是否同為指標或引用,除了常屬性外其他必須完全相同,否則報錯

reinterpret_cast《目標型別》(源型別) 編譯器會對源型別和目標類是否同為指標和整數進行檢查,也就是說把整數轉換成指標或把指標轉換為整數

動態編譯和靜態編譯 (動態鏈結,動態鏈結=》動態庫靜態庫)

靜態編譯:指標或引用的目標是確定的,在編譯期間就確定所有型別檢查、函式呼叫。

動態編譯:指標或引用的目標是不確定的(多型),只有函式呼叫時候才確定,具體是哪個子類

c++和c語言都支援:變長陣列

fstream/ifstream/ofstream 類用於進行檔案操作

建構函式或者成員函式 open 用於開啟檔案

good成員函式檢查流是否可用

eof成員函式用於輸入流是否結束

>> 操作符用於從檔案中讀取資料到變數

<< 操作符用於輸入出資料到檔案

io流有一系列格式化控制函式,類似:左對齊、右對齊、寬度、填充、小數點位數

二進位制的讀寫:read/write

read (char_type *__s,streamsize __n)

gcount成員函式可以獲取上次流的二進位制讀操作的位元組數。

write(char_type *__s,streamsize __n)

good成員函式可以獲取到寫操作是否成功

隨即讀寫:

seekp(off_type,ios_base::seekdir)

功能:設定檔案的位置指標

off_type:偏移值

正值向右,負值向左

seekdir:基礎位置

ios::beg 檔案開頭

ios::cur 當前位置

ios::end 檔案末尾

拋異常throw 資料

拋異常物件

拋基本型別

注意:不能拋區域性物件的指標或引用

如果異常沒有**獲處理,程式就會異常停止

捕獲資料

trycatch(型別 變數名)

注意:捕獲異常的順序是自上而下的,而不是最精準的匹配,針對子類異常捕獲時要放在父類的前面

函式的異常宣告:

返回值型別 函式名(引數列表)throw(型別1,型別2…)

注意:如果不寫異常申明表示司馬型別的異常都可能丟擲

注意:throw()表示什麼都不丟擲

注意:如果寫了異常宣告表示只丟擲某些型別的異常,一旦超出異常的範圍,程式會直接停止,無法捕獲

設計異常類:

class

error

intgeterror

(void)}

;

C 的虛析構

最近準備複習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。父類為a,子類為b,如下 1 classa2 8 a 912 13class b publica14 20 b 2124 25 這個時候在main函式裡,定義乙個a的物件,a a 執行輸出結果為 構造a 析構a。定義乙個b的物...

C 學習筆記 虛析構函式與純虛析構函式

開始學c 了,所以又重拾以前學習過的相關概念 析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 define a h class a endif 虛析構函式與純虛析構函式的定義 假定類名為a define a h class a endif define a h class ...

C 學習筆記 虛析構函式與純虛析構函式

析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 private int a int b int c endif 虛析構函式與純虛析構函式的定義 假定類名為a private int a int b int c endif endif 其中定義了純虛函式後,類a就成為了 抽象...