學習C 的一些筆記(四)

2021-08-02 10:16:25 字數 2950 閱讀 4358

91.raii(獲取資源時才初始化,一種資源管理方式)本身為棧物件

92.智慧型指標,一共有4種auto_ptr(只能生成棧物件),unique_ptr,shared_ptr(強引用指標),weak_ptr(弱引用指標)。標頭檔案為#include,使用只能指標主要是為了防止記憶體洩露,傳統的記憶體分配方式如果忘記**記憶體,會造成記憶體洩漏。智慧型指標過期後,會自動呼叫析構函式delete**記憶體

93.對乙個物件所有權的轉移發生在複製或賦值的時候

94.檢視shared_ptr的引用計數,用use_count()函式,shared_ptr指向堆空間,但如果指向的多個物件本身還相互指向,存在指標,變成乙個迴圈,即使shared——ptr退出後,由於引用計數不為0,空間不會被釋放。解決上面問題,用weak_ptr,weak_ptr不是用引用計數

95.通過lock函式把weak_ptr提公升為shared_ptr

96.左值是指表示式結束後依然存在的持久物件,右值是值表示式結束時就不存在的臨時物件(能對表示式取位址,即為左值,否則是右值)

97.右值引用是兩個引用符號,int &&a = 10(10不是常量,為字面值),右值引用的使用主要關於移動語義,簡單的說,就是,值的存放的記憶體不變,而變數與該記憶體相關聯,不需要刪除臨時物件。(類似於計算機的檔案移動,即只改變了記錄)

98.在即有類的基礎上定義新的類,而不是將即有類的內容重新書寫一遍,這種稱為繼承,即有類稱為父類或者基類,在它基礎上建立的類成為派生類或者子類和匯出類。格式為:class 子類名 : 繼承方式(pubilc, private,protected) 父類名。子類在記憶體中布局的時候,首先會吸收父類的成員。當子類的函式跟父類函式相等時,子類函式會隱藏父類函式。(與基類和派生類的訪問屬性無關;與基類和派生類的函式間的引數和返回型別無關)沒有寫繼承方式,預設為private

99.子類繼承不了父類的建構函式,析構函式,使用者過載的new,delete運算子,使用者過載的=運算子,友元關係

100.不管是什麼繼承方式,子類都不能訪問父類的私有成員。子類內部除了父類的私有成員外,其他的都能訪問。車了公有繼承基類中的公有成員,子類物件可以訪問外,其他的子類物件一律不能訪問

101.多重繼承,class 子類名 : 繼承方式1(pubilc, private,protected) 父類名1,繼承方式2(pubilc, private,protected) 父類名2,規則與普通繼承相同,但是一般不推薦使用,維護成本太高

102.對於多重繼承,如果有相同函式名,要呼叫函式,要加上類作用域,如c.a::print() c.b::print()(消除二義性)

103.由於建構函式和析構函式不能繼承,為了對父類成員進行初始化,必須對子類重新定義建構函式和析構函式,並在建構函式的初始化列表中呼叫基類的建構函式。建立乙個子類後,要先對基類成員進行初始化,然後才能對子類中的新增成員進行初始化。

104.如果派生類有建構函式,而基類沒有,則建立派生類的物件時,派生類相應的建構函式會被自動呼叫,此時都自動呼叫了基類預設的無參建構函式。

105.如果派生類沒有建構函式而基類有,則基類必須擁有預設建構函式。

106.如果派生類有建構函式,基類有預設建構函式,則建立派生類的物件時,基類的預設建構函式會自動呼叫,如果你想呼叫基類的有參建構函式,必須要在派生類建構函式的初始化列表中顯示呼叫基類的有參建構函式。

107.如果派生類和基類都有建構函式,但基類沒有預設的無參建構函式,即基類的建構函式均帶有引數,則派生類的每乙個建構函式必須在其初始化列表中顯示的去呼叫基類的某個帶參的建構函式。如果派生類的初始化列表中沒有顯示呼叫則會出錯,因為基類中沒有預設的建構函式。

108.各基類建構函式的執行順序與其在初始化表中的順序無關,而是由定義派生類時指定的派生類順序決定的。

109 .

「型別適應」是指兩種型別之間的關係,說

a類適應

b類是指

a類的物件能直接用於

b類物件所能應用的場合,從這種意義上講,派生類適應於基類,派生類的物件適應於基類物件,派生類物件的指標和引用也適應於基類物件的指標和引用。

110.總而言之,構造乙個子類物件的時候,每次都要在初始化列表裡面顯式的呼叫乙個建構函式

111.在執行派生類析構函式時,基類析構函式會被自動呼叫。

112.隱藏(oversee):父子類,函式名稱相同,不帶virtual關鍵字函式。覆蓋(override):父子類,函式名稱,返回值型別,引數的型別個數都相同。過載(overload):同乙個類,函式名稱相同,引數不同(型別,順序,個數)

113.基類與派生類之間的轉換,可以通過引用,指標,強制轉換的方式,將派生類轉換為基類(只能將派生類轉換為基類,但是基類不能轉換為派生類,這樣會編譯通不過)

114.如果使用者定義了派生類的拷貝建構函式或者過載了派生類的賦值運算子=,就不會再自動呼叫基類的拷貝建構函式和基類的過載物件賦值運算子,這時候就要顯式呼叫

115.多型,即乙個介面,多種方法(多型性是指同乙個操作作用於不同的物件就會產生不同的響應)。多型分為兩種形式,1.靜態多型(函式過載和運算子過載)。2.動態多型(虛函式)

116.c++編譯器根據傳遞給函式的引數和函式名決定具體要使用哪個函式,稱為聯編。當乙個程式在編譯完畢後,這種行為就固定了,稱為靜態聯編。動態聯編,即編譯器無法在編譯過程中完成聯編,必須在程式執行完成選擇,稱為動態聯編

117.為什麼需要虛函式,如果不加virtual,具體呼叫哪個版本的函式,取決於指標本身的型別,與指標所指物件無關。加了virtual後,則反之

118.形成多型的條件:有繼承關係並且派生類中對基類的virtual函式現實了覆蓋,利用基類的引用或指標指向派生類物件,再用基類的物件去呼叫virtual函式的時候會實現多型

119.如果乙個基類的函式定義為virtual,則它在派生類中也是虛函式。無論前面有沒有virtual,如,父類中有virtual void disp() 子類中有 void disp(),這個也是虛函式

120.派生類中可以對虛函式進行重定義,但是必須有相同的引數型別,個數和返回型別

學習C的一些筆記(一)

總結下很早以前的筆記,溫故而知新。printf 2d 2d 3d index i 1,index j 1,index i 1 index j 1 在輸入一長串數,但需要單個讀入的時候,就需要指定寬度 即 1d 如身份證系統scanf 1d a i 其中 代表左對齊,2,3代表顯示幾個字元,不足,用空...

C 的一些筆記

發現一些小的知識點長期不用都得忘,決定再次遇到了一定要記錄一下。任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。在建構函式前加explicit關鍵字禁止物件作隱式...

一些C 筆記

this指標 類的繼承 基類 父類 子類 如果基類和子類都有構造器,則基類的構造器會先被呼叫。class animal class pig public animal animal animal std string thename pig pig std string thename animal...