首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 核心特性大彙總:從指針到模板的 49 個關鍵知識點

     編輯:關於C++

前言

本文匯總 C++ 核心語法與慣用模式 49 條,涵蓋指針/引用、類設計、內存管理、函數/模板、標準庫、類型轉換等維度,適合作為速查手冊或面試複習。

一、 指針、引用與內存模型

  1. 不同類型指針不可直接賦值,需 static_cast 或 C 風格強轉:int* p = (int*)voidPtr;
  2. 類是面向對象核心,class 默認 private,struct 默認 public。
  3. 命名空間 隔離大型項目符號衝突:namespace NS { ... }。
  4. new/delete 配對:單對象 delete p,數組 delete[] p,切勿混用導致洩漏。
  5. inline 建議:適用於體積小、調用頻繁的函數,編譯器可選擇忽略。
  6. 引用是別名非地址:int& r = a; 必須初始化,綁定後不可重綁,&r == &a。
  7. 默認實參:void f(int a=10); 只能從右向左連續指定。
  8. 函數重載:同名不同參數列表(返回類型不參與重載)。
  9. 模板函數:template T add(T a,T b){return a+b;} 實現泛型。
  10. 訪問控制:private/protected/public,類默認 private,結構體默認 public。
  11. unsigned 陷阱:unsigned + signed → unsigned,1u + (-2) == 4294967295u。
  12. 字符串字面值相鄰自動拼接:"abc" "def" → "abcdef"。
  13. 內置類型初始化規則:局部變量不初始化(值不定),全局/靜態/類成員零初始化。
  14. extern 聲明非定義:extern int i; 僅聲明,extern int j=1; 定義並初始化。
  15. 引用綁定規則:必須綁定左值對象,int& r = 1; 錯誤(C++11 const int& 或 int&& 除外)。
  16. void* 通用指針:可存任意對象地址,但需強轉回原類型才能解引用。
  17. const 內部鏈接:全局 const 默認僅文件可見,跨文件需 extern const 定義 + extern const 聲明。
  18. 頂層/底層 const:int* const p(頂層,指針不可變),const int* p(底層,所指值不可變)。
  19. 常量指針/引用可綁定非常量對象,但不可通過它們修改值;非常量指針/引用不可綁定常量對象。
  20. 字符串初始化區別:string s = "a"(拷貝初始化),string s("a")(直接初始化)。
  21. getline 讀整行:保留空格,while(getline(cin,s)) 處理多行輸入。
  22. 字面值 + string 運算:至少一邊為 string 對象,"a" + "b" 錯誤,s + "a" 正確。
  23. vector 動態陣列:vector v; 無需預設大小,push_back 摊銷 O(1);若所有元素同值可 vector v(10, 5);。
  24. 範圍 for 修改元素:for(auto& x : v) x *= 2; 必須用引用。
  25. 迭代器核心操作:*it、it->mem、++it/--it、==/!=;end() 指向尾後不可解引用。
  26. 迭代器失效規則:vector 增容導致所有迭代器失效;list 插入刪除僅影響被刪元素迭代器。
  27. 字符數組初始化:char a[]={'c','+','+','\0'}; 等價 "c++"(含隱式 \0)。
  28. 指針遍歷數組:int *beg=arr, *end=arr+size; C++11 推薦 begin(arr)/end(arr)。
  29. C 風格字符串函數:strlen/strcmp/strcpy 需以 \0 結尾;string::c_str() 轉 const char*。
  30. 數組初始化 vector:vector v(begin(arr), end(arr)); 或切片 arr+1, arr+3。
  31. 多維數組指針遍歷:for(auto p=arr; p!=arr+3; ++p) for(auto q=*p; q!=*p+4; ++q) 或 begin/end 版本更安全。
  32. 前置 ++ 優於後置 ++:後置需拷貝舊值,對迭代器類類型開銷大;內置類型編譯器常優化。
  33. sizeof 不求值:sizeof *p 不解引用 p,sizeof vector 只含固定部分不含動態元素。
  34. 算術轉換規則:向最寬類型轉換,long double > double > float > 整型提升。
  35. 四大強轉:static_cast(相關類型、無底層 const)、dynamic_cast(多態向下轉)、const_cast(增減底層 const)、reinterpret_cast(位模式重新解釋)。
  36. 局部靜態對象:static int cnt=0; 首次經過初始化,程序結束銷毀,線程安全 (C++11)。
  37. 聲明在頭文件,定義在源文件:避免重複定義,加快編譯。
  38. 大對象傳參用 const 引用:bool shorter(const string&, const string&); 避免拷貝,const 承諾不修改。
  39. 數組形參退化為指針:void f(int a[]) ≡ void f(int* a),長度信息丟失,需額外傳長度或用 span (C++20)。
  40. 三種傳遞數組長度方式:結束標記(如 \0)、首尾指針對、顯式長度參數。
  41. 多維數組形參:void f(int a[][10]) ≡ void f(int (*a)[10]),第一維可省略,其餘必須給定。
  42. 返回引用:char& get(string&, int); 可作左值 get(s,0)='x';。
  43. 返回數組指針:int (*f())[10]; 返回指向 10 元素數組的指針。
  44. 函數指針:bool (*pf)(const string&, const string&); 可存儲於容器 vector,配合 typedef/using 簡化聲明。
  45. 友元:friend void Manager::clear(ScreenIndex); 破壞封裝但提供受控訪問,聲明順序需滿足依賴。
  46. mutable 突破 const:允許 const 成員函數修改該數據成員(如緩存、鎖)。
  47. 成員初始化列表:C(int a): x(a), y(a) {} 必須用於 const/引用/無默認構造的成員,順序按類中聲明順序而非列表順序。
  48. 最令人糾結的解析:Person p(); 聲明函數非對象,正確 Person p;。
  49. 隱式類類型轉換:單參數構造函數啟用隱式轉換,explicit 禁止(explicit SalesData(string);)。

二、 速查表:核心語法對照

場景正確寫法錯誤寫法
引用綁定字面值const int& r = 42;int& r = 42;
vector 範圍 for 修改for(auto& x : v)for(auto x : v) (拷貝)
函數指針聲明using PF = int(*)(int,int);int *PF(int,int); (函數聲明)
禁止隱式轉換explicit A(int);A(int);
默認構造對象A a;A a(); (函數聲明)

總結

這 49 點串聯起 C++ 核心語法骨架。建議:

  • 針對薄弱項編寫最小驗證代碼
  • 關注「為什麼這樣設計」(如迭代器失效、隱式轉換)
  • 實戰中優先使用現代 C++(auto、範圍 for、智能指釖、string_view 等)

內功深厚,方能駕馭 C++ 這把雙刃劍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved