本文匯總 C++ 核心語法與慣用模式 49 條,涵蓋指針/引用、類設計、內存管理、函數/模板、標準庫、類型轉換等維度,適合作為速查手冊或面試複習。
static_cast 或 C 風格強轉:int* p = (int*)voidPtr;class 默認 private,struct 默認 public。namespace NS { ... }。new/delete 配對:單對象 delete p,數組 delete[] p,切勿混用導致洩漏。inline 建議:適用於體積小、調用頻繁的函數,編譯器可選擇忽略。int& r = a; 必須初始化,綁定後不可重綁,&r == &a。void f(int a=10); 只能從右向左連續指定。template T add(T a,T b){return a+b;} 實現泛型。private/protected/public,類默認 private,結構體默認 public。unsigned 陷阱:unsigned + signed → unsigned,1u + (-2) == 4294967295u。"abc" "def" → "abcdef"。extern 聲明非定義:extern int i; 僅聲明,extern int j=1; 定義並初始化。int& r = 1; 錯誤(C++11 const int& 或 int&& 除外)。void* 通用指針:可存任意對象地址,但需強轉回原類型才能解引用。const 內部鏈接:全局 const 默認僅文件可見,跨文件需 extern const 定義 + extern const 聲明。int* const p(頂層,指針不可變),const int* p(底層,所指值不可變)。string s = "a"(拷貝初始化),string s("a")(直接初始化)。getline 讀整行:保留空格,while(getline(cin,s)) 處理多行輸入。string 對象,"a" + "b" 錯誤,s + "a" 正確。vector 動態陣列:vector v; 無需預設大小,push_back 摊銷 O(1);若所有元素同值可 vector v(10, 5); 。for(auto& x : v) x *= 2; 必須用引用。*it、it->mem、++it/--it、==/!=;end() 指向尾後不可解引用。vector 增容導致所有迭代器失效;list 插入刪除僅影響被刪元素迭代器。char a[]={'c','+','+','\0'}; 等價 "c++"(含隱式 \0)。int *beg=arr, *end=arr+size; C++11 推薦 begin(arr)/end(arr)。strlen/strcmp/strcpy 需以 \0 結尾;string::c_str() 轉 const char*。vector v(begin(arr), end(arr)); 或切片 arr+1, arr+3。for(auto p=arr; p!=arr+3; ++p) for(auto q=*p; q!=*p+4; ++q) 或 begin/end 版本更安全。sizeof 不求值:sizeof *p 不解引用 p,sizeof vector 只含固定部分不含動態元素。long double > double > float > 整型提升。static_cast(相關類型、無底層 const)、dynamic_cast(多態向下轉)、const_cast(增減底層 const)、reinterpret_cast(位模式重新解釋)。static int cnt=0; 首次經過初始化,程序結束銷毀,線程安全 (C++11)。bool shorter(const string&, const string&); 避免拷貝,const 承諾不修改。void f(int a[]) ≡ void f(int* a),長度信息丟失,需額外傳長度或用 span (C++20)。\0)、首尾指針對、顯式長度參數。void f(int a[][10]) ≡ void f(int (*a)[10]),第一維可省略,其餘必須給定。char& get(string&, int); 可作左值 get(s,0)='x';。int (*f())[10]; 返回指向 10 元素數組的指針。bool (*pf)(const string&, const string&); 可存儲於容器 vector,配合 typedef/using 簡化聲明。friend void Manager::clear(ScreenIndex); 破壞封裝但提供受控訪問,聲明順序需滿足依賴。mutable 突破 const:允許 const 成員函數修改該數據成員(如緩存、鎖)。C(int a): x(a), y(a) {} 必須用於 const/引用/無默認構造的成員,順序按類中聲明順序而非列表順序。Person p(); 聲明函數非對象,正確 Person p;。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++ 核心語法骨架。建議:
auto、範圍 for、智能指釖、string_view 等)內功深厚,方能駕馭 C++ 這把雙刃劍。