C++ 知識點整理

1. static關鍵字

  • ①:全局靜態變量
  • 全局變量前加上關鍵字 static,全局變量就定義成一個全局靜態變量。
  • 全局靜態變量存在於靜態存儲區,在整個程序運行期間一直存在。
  • 未經初始化的全局靜態變量會被自動初始化爲 0。
  • 全局靜態變量在聲明他的文件之外是不可見的,準確地說是從定義之處開始,到文件結尾。
  • ②:局部靜態變量
  • 在局部變量之前加上關鍵字 static,局部變量就成爲一個局部靜態變量。
  • 局部靜態變量在內存中的位置:靜態存儲區。
  • 未經初始化的局部靜態變量會被自動初始化爲 0。
  • 作用域仍爲局部作用域,當定義它的函數或者語句塊結束的時候,作用域結束。但是當局部靜態變量離開作用域後,並沒有銷燬,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數再次被調用,並且值不變。
  • ③:靜態函數
  • 在函數返回類型前加 static,函數就定義爲靜態函數。函數的定義和聲明在默認情況下都是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。
  • ④:類的靜態成員
  • 在類中,靜態成員可以實現多個對象之間的數據共享,並且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有對象中共享的成員,而不是某個對象的成員。對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。
  • ⑤:類的靜態函數
  • 靜態成員函數和靜態數據成員一樣,它們都屬於類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。在靜態成員函數的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員(這點非常重要)。如果靜態成員函數中要引用非靜態成員時,可通過對象來引用。

2. c 和 c++ 有什麼區別

  • ①:設計思想上:
  • c++ 是面向對象的語言,而 c 是面向過程的結構化編程語言。
  • ②:語法上:
  • c++ 具有封裝,繼承和多態三種特性;
  • c++ 相比 c,增加許多類型安全的功能,比如強制類型轉換;
  • c++ 支持範式編程,比如模板類和函數模板。

3. c++ 四種 cast 轉換

  • ①:const_cast
  • 用於將 const 變量轉爲非 const 變量。
常量指針 非常量指針,且仍然指向原來的對象
常量引用 非常量引用,且仍然指向原來的對象
常量對象 非常量對象
  • static_cast
  • 用於各種隱式轉換,比如非 const 轉 const,void* 轉指針等, static_cast 能用於多態向上轉化,如果向下轉能成功但是不安全,結果未知
  • reinterpret_cast
  • 幾乎什麼都可以轉,比如將 int 轉指針,可能會出問題,儘量少用。
  • dynamic_cast
  • 用於動態類型轉換。只能用於含有虛函數的類,用於類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對於指針返回 NULL,對於引用拋異常。要深入瞭解內部轉換的原理。
    向上轉換:指的是子類向基類的轉換
    向下轉換:指的是基類向子類的轉換
    它通過判斷在執行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。
  • 爲什麼不使用 c 的強制類型轉化
  • c 的強制轉換表面上看起來功能強大什麼都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。

3. c/c++ 指針和引用的區別

  • ①:指針有自己的一塊空間,而引用則知識一個別名;
  • ②:使用sizeof()看一個指針的大小是4,而引用則是被引用對象的大小;
  • ③:指針可以被初始化爲NULL,而引用必須被初始化一個也有的對象;
  • ④:作爲參數傳遞時,指針必須被解引用纔可以對對象進行操作,而直接對引用的修改也會改變所引用的對象;
  • ⑤:可以有const指針,但是沒有const引用;
  • ⑥:指針在使用時可以指向其他對象,但是引用只能是一個對象的引用,不能被改變;
  • ⑦:指針可以有多級指針,如**p,而引用只有一級;
  • ⑧:指針和引用使用後++運算符的意義不一樣;
  • ⑨:如果返回動態內存分配的對象或引用,必須使用指針。使用引用可能引起內存泄露。

4. c++ 的四個智能指針

  • c++ 裏面的四個智能指針: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中後三個是 c++11 支持,並且第一個已經被 c++ 11 棄用。
  • 爲什麼要使用智能指針:
  • 智能指針的作用是管理一個指針,因爲存在以下這種情況:申請的空間在函數結束時忘記釋放,造成內存泄漏。使用智能指針可以很大程度上的避免這個問題,因爲智能指針就是一個類,當超出了類的作用域時,類會自動調用析構函數,析構函數會自動釋放資源。所以智能指針的作用原理就是在函數結束時自動釋放內存空間,不需要手動釋放內存空間。
  • ①:auto_ptr
  • ②:shared_ptr
  • ③:weak_ptr
  • ④:unique_ptr
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章