1. 指針傳遞與修改權限
- 傳指針可修改指向的內容,不可修改外部指針本身(指向對象)。
- 需修改外部指針指向 → 傳指針的指針(
T**)或指針的引用(T*&)。
2. 數組初始化速記
char carry[10] = {0}; // 編譯器將所有元素置0
3. const返回值限制
函數返回const T,賦值給同類型變量後,該變量不能作左值(不可賦值、不可取地址、不可自增)。
4. const指針三種形式語義區別
const int *p; // 指向常量的指針:p可改,*p不可改
int const *p; // 同上(const修飾int)
int *const p; // 常指針:p不可改,*p可改
口訣:const在*左鎖內容,在右鎖指針。
5. 類const成員函數機制
- 聲明:
void func() const; — 承諾不修改對象狀態
- 限制:不能修改非mutable成員,不能調用非const成員函數
- 兩種「破壞」手段:
- 強制轉型:
(MyClass*)this->member = val;(惡搞,慎用)
- 成員聲明
mutable:mutable int cache; — 允許const函數修改,用於緩存、鎖、統計計數等邏輯無關狀態
6. 類內const與enum定義數組大小差異
class A {
const int SIZE = 100; // 不能用作數組大小:int arr[SIZE]; // 錯誤
enum { SIZE2 = 100 }; // 可用作數組大小:int arr[SIZE2]; // 正確
};
enum成員屬於編譯期常量,const成員(非static)屬於對象實例,故前者可作數組界限。
7. enum隱式遞增規則
enum A { L = 9, Z }; // Z = 10(隱式+1)
8. const定義數組的限制
const int N = 10; int arr[N]; — 合法(編譯期常量)
const int arr[] = {1,2,3}; int arr2[arr[0]]; — 非法(數組元素非常量表達式)
9. sizeof操作數細節
| 操作數 | 結果 | 說明 |
| 數組 | 實際佔用字節數 | sizeof(arr) |
| 字符串字面值 | 長度+1 | 含結束符\0,存儲在靜態區 |
| 指針 | 指針大小(4/8字節) | 不關心指向內存大小 |
| 函數形參數組 | 指針大小 | 形參退化為指針 |
10. 數組元素個數計算
int iarray[] = {12, 124, 433};
int count = sizeof(iarray) / sizeof(*iarray); // 3
11. 拷貝構造函數調用時機
- 按值傳參(複雜對象)→ 生成臨時對象,函數結束析構
- 按值返回對象 → 調用拷貝構造賦值給接收者
- 導致構造/析構調用次數不等
原型:A(A&)(建議A(const A&))。默認淺拷貝(位拷貝),指針成員僅拷貝地址 → 雙重釋放風險,必須深拷貝重載。
12. volatile防優化語義
- 告訴編譯器:勿優化該變量訪問,每次從內存讀寫
- 多線程場景:防止寄存器緩存導致髒讀
- 硬體寄存器映射、信號處理器共享變量必加
13. class vs struct唯一區別
class默認private
struct默認public
- 功能完全等價,
class非C++必需保留字
14. C/C++混合編程:extern "C"
- C++編譯器對函數名做Name Mangling(如
_Z3fooi)
- C編譯器不修飾(
foo)
- 調用C庫:
extern "C" { #include "clib.h" } 告訴鏈接器用C符號規則
- 標準庫頭文件已內部處理
15. #include路徑搜索順序
#include "file.h":當前目錄 → 系統路徑
#include :直接系統路徑
16. static變量生命周期與可見性
- 生命周期 = 主進程(程序啟動到結束)
- 函數內
static:首次調用初始化,保持值,作用域僅函數內
- 文件級
static:內部鏈接,僅本文件可見
- 類
static成員:全類對象共享一份存儲
延伸閱讀
- C++指針用法總結
- 如何成為合格C++程序員
- C++編程常用工具鏈
- 給C++初學者的50條忠告
- C++最基礎的20條鐵律
- 上一篇文章: 寫出優雅代碼的十大原則:從命名規範到控制結構優化
- 下一篇文章: C++核心知識點精華總結(下):內聯、斷言、對象生命周期、名字空間、成員指針
Copyright ©
程式碼之家 All Rights Reserved