interview 知識點

C++ 知識點

內聯函數inline

  1. inline 和 宏定義#define的作用基本類似,都是替換或者展開。 在程序編譯階段,如果遇到內聯函數,則將內聯函數的實現在當前位置展開。內聯的目的是爲了減少函數的調用開銷,從而提高運行效率,但會增加代碼體量。

內聯函數的優缺點

優點:

(1)通過避免函數的回調,加速了程序的執行;

(2) 通過利用指令緩存,增強局部訪問性;

(3)使用內聯可以替換重複的短代碼,方便代碼管理;

缺點:

(1) 由於是替換展開,因此會增大代碼體量;
(2)一旦修改內聯,所有用到該內聯的地方都需要重新編譯;

內聯函數與宏的區別

(1)內聯函數可調試,而宏定義不行;

(2)內聯函數首先是函數,函數的很多性質都適用於內聯函數,如:內聯函數可以重載;編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會;

(3)內聯函數可以訪問類的私有成員變量,宏定義則不能;

static的用法詳解

1. 靜態局部變量:用於函數體內部修飾變量,這種變量的生存期長於該函數。

		int foo() {
			static int i = 1;  //在調用的第一次進行初始化,之後調用不再初始化
			return i;
		}
		//跟定義一個全局變量有什麼區別呢,同樣是初始化一次,連續調用foo()的結果是一樣的,
		//但是,使用全局變量的話,變量就不屬於函數本身了,不再僅受函數的控制,
		//給程序的維護帶來不便。靜態局部變量正好可以解決這個問題。
		//靜態局部變量保存在全局數據區,而不是保存在棧中,每次的值保持到下一次調用,
		//直到下次賦新值。

2.靜態全局變量:定義在函數體外,用於修飾全局變量,表示該變量只在本文件可見。

3.靜態函數:準確的說,靜態函數跟靜態全局變量的作用類似:(不能被其它文件所用;其它文件中可以定義相同名字的函數,不會發生衝突;)

4.靜態數據成員:用於修飾 class 的數據成員,即所謂“靜態成員”。這種數 據成員的生存期大於 class 的對象(實體 instance)。靜態數據成員是每個 class 有一份,普通數據成員是每個 instance 有一份,因此靜態數據成員也叫做類變量,而普通數據成員也叫做實例變量。

5.靜態成員函數:用於修飾 class 的成員函數。

(1)調用靜態成員函數,可以用成員訪問操作符(.)和(->)爲一個類的對象或指向類對象的指針調用靜態成員函數,也可以用類名::函數名調用
(2) 靜態成員函數不能訪問非靜態數據和調用非靜態函數,非靜態成員函數可以訪問靜態數據。

Volatile

volatile的本意是“易變的” 因爲訪問寄存器要比訪問內存單元快的多,所以編譯器一般都會作減少存取內存的優化,但有可能會讀髒數據。當要求使用volatile聲明變量值的時候,系統總是重新從它所在的內存讀取數據

C++ 中 struct 和 class

struct 更適合看成是一個數據結構的實現體,class 更適合看成是一個對象的實現體。
最本質的一個區別就是默認的訪問控制
默認的繼承訪問權限。struct 是 public 的,class 是 private 的。

左值與右值

最早是從C語言繼承而來的。在C語言,或者繼承版本的解釋

  • 左值是可以位於賦值運算符 = 左側的表達式(當然,左值也可以位於 = 的右側),而
  • 右值是不可以位於賦值運算符 = 左側的表達式。

根據《C++ Primer》的說法,左值和右值可以這樣區分:

  • 一個表達式是左值還是右值,取決於我們使用的是它的值還是它在內存中的位置(作爲對象的身份)。也就是說一個表達式具體是左值還是右值,要根據實際在語句中的含義來確定。

      (通俗的左值的定義就是非臨時對象,那些可以在多條語句中使用的對象。所有的變量都滿足這個定
      義,在多條代碼中都可以使用,都是左值。右值是指臨時的對象,它們只在當前的語句中有效)
    

左值和右值的語法符號:左值的聲明符號爲”&”, 爲了和左值區分,右值的聲明符號爲”&&”。

新特性的目的
右值引用 (Rvalue Referene) 是 C++ 新標準 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它實現了轉移語義 (Move Sementics) 和精確傳遞 (Perfect Forwarding)。它的主要目的有兩個方面:

消除兩個對象交互時不必要的對象拷貝,節省運算存儲資源,提高效率。
能夠更簡潔明確地定義泛型函數。

details: https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/index.html

虛函數

C++中的虛函數(表)實現機制以及用C語言對其進行的模擬實現: https://blog.twofei.com/496/

智能指針

  • shared_ptr:多個智能指針可以共享同一個對象,對象的最末一個擁有着有責任銷燬對象,並清理與該對象相關的所有資源。
  • weak_ptr:允許你共享但不擁有某對象,一旦最末一個擁有該對象的智能指針失去了所有權,任何weak _ptr 都會自動成空
  • unique_ptr: 是一種在異常時可以幫助避免資源泄漏的智能指針。採用獨佔式擁有,意味着可以確保一個對象和其相應的資源同一時間只被一個 pointer 擁有。一旦擁有着被銷燬或編程 empty,或開始擁有另一個對象,先前擁有的那個對象就會被銷燬,其任何相應資源亦會被釋放
發佈了54 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章