1、指針指針
auto_ptr:剝奪所有權機制,C++11已廢棄,使用不安全
unique_ptr:針對auto_ptr的改進
share_ptr:最常用的引用計數
weak_pre:防止循環引用而設立的
2、explicit構造函數
每一個指針指針都有一個explicit構造函數,用explicit修飾構造函數的作用是禁止隱式轉換或複製初始化。
3、類對象的初始化過程
類對象的新建:靜態與動態。
類對象的初始化:1、默認初始化;2、直接初始化;3、拷貝初始化;4、值初始化。
必須使用初始化列表的場景:
a. 常量成員。常量只能初始化不能賦值,必須放在初始化列表裏面。
b. 引用類型。引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表裏面。
c. 沒有默認構造函數的類類型。因爲使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化
4、內聯函數
a、直接使用,沒有調用開銷
b、不能包含循環與switch語句。
5、類型轉換
const_cast:用於將const變量轉爲非const
static_cast:用於各種隱式轉換,比如非const轉const,void*轉指針等, static_cast能用於多態向上轉化,如果向下轉能成功但是不安全,結果未知;
dynamic_cast:用於動態類型轉換。只能用於含有虛函數的類,用於類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對於指針返回NULL,對於引用拋異常。要深入瞭解內部轉換的原理。
向上轉換:指的是子類向基類的轉換
向下轉換:指的是基類向子類的轉換
它通過判斷在執行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。
reinterpret_cast:幾乎什麼都可以轉,比如將int轉指針,可能會出問題,儘量少用;
6、野指針
a. 未初始化的指針變量。
b. 指向的內存被釋放沒有置NULL的指針。
c. 超過了變量作用範圍的指針
7、C++多態
靜態多態:函數重載實現
動態多態:通過虛函數實現
8、構造函數爲什麼不能是虛函數
虛函數對應一個虛函數表,虛函數表是存在在對象的內存空間的,如果構造函數是虛函數,就需要有一個虛函數表來調用,但是類還沒有實例化就沒有內存空間,也就沒有虛函數表。形成一個死循環。
9、基類虛構函數爲什麼是虛函數
a、動態多態。當父類指針指向子類對象,在析構時,編譯器只知道這是一個父類指針,所以只將父類的內存進行了析構,而不會去析構子類的內存,造成了內存泄漏。
b、基類析構函數定義爲虛擬函數的時候,在子類的對象的首地址開始會有一塊基類的虛函數表拷貝,在析構子類對象的時候會刪除此虛函數表,此時會調用基類的析構函數,所以此時內存是安全的。
c、C++默認的析構函數不是虛函數是因爲虛函數需要額外的虛函數表和虛表指針,佔用額外的內存。
10、函數指針與回調函數
指向函數地址的指針,常在回調函數中使用。
11、fork()函數
創建一個和當前進程映像一樣的進程可以通過fork( )系統調用。
父進程調用返回子進程的進程號,子進程調用返回1,錯誤情況返回負數。
12、stick關鍵字
a、stick變量類相關,與對象無關。
b、多線程中,stick變量只會被初始化一次,即多線程中不會改變其值。
c、加了static關鍵字,則此變量/函數就沒有了this指針了,必須通過類名才能訪問。
13、resize()與reserve()
resize()改變容器大小,會導致容器內元素的增刪。
reserve()僅改變容器的容量,不對對容器元素髮生改變。
參考資料: