C++面試常見概念--inline、virtual、static彙總總結

inline內聯函數
簡單來說,編譯器將inline函數體代碼直接複製到inline函數調用點處而非普通函數的函數調用,有點像宏但是比宏更安全會,會做安全檢查或自動類型轉換。
特點:
省去了參數壓棧、棧幀開闢與回收,結果返回等,加快運行速度;
大多類的成員函數(沒有循環遞歸、定義在內類或顯示內聯等)會自動轉化爲內聯函數;
但是也會造成代碼膨脹、版本迭代不便、程序員不可控缺點。


virtual虛函數

  • 普通虛函數
    一般講到虛函數大家都會告訴你創建了一張虛表Vtable,實現了多態的機制。
    那什麼是多態機制呢?就是父類指針可以直接指向子類實例,通過父類的指針調用實際子類的成員函數,實現父類的多種形態。
    那爲什麼父類指針可以直接指向子類實例呢?這就是虛表的功勞了,子類對應的虛表中首先寫入父類函數地址,如果有同名同參函數則替代相應函數地址,也就是說子類虛表中包含任何父類可調用函數的地址(或替換地址)。
    特點:
    構造函數不是虛函數,析構函數是虛函數;
  • 純虛函數
    C++中包含純虛函數的類,被稱爲是“抽象類”。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。純虛函數“只提供申明,沒有實現”,純虛函數必須在子類(sub class)中實現該函數纔可以使用。
    特點:
    不能被實例化

static靜態函數、變量

  • 靜態變量
    全局靜態變量:與普通全局變量不同,普通全局變量對全局所有文件可見,容易出現重名混淆等問題,static則不必擔心命名衝突。
    局部靜態變量:生存期爲整個源程序,但是其作用域仍與自動變量相同,只能在定義該變量的函數內使用該變量。
    靜態變量默認初始化爲0。
  • 靜態成員函數
    特點:
    類的靜態成員函數是屬於整個類而非類的對象;
    不能將靜態成員函數定義爲虛函數;
    初始化在類體外進行,而前面不加static,以免與一般靜態變量或對象相混淆。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章