在 C++ 中,& 同時扮演兩種截然不同的角色:
int* p = &a; 取得變數記憶體位址int& r = a; 為變數建立別名編譯器依據**上下文**(型別宣告 vs 運算式)自動區分。
int a = 5;
int* p = &a; // p 保存 a 的位址
std::cout << p; // 輸出位址(如 0x7ffc1234)
std::cout << *p; // 解參考,輸出 5
T*(指向原型別的指標)int a = 5;
int& r = a; // r 是 a 的別名,非新變數
r = 10; // a 變為 10
std::cout << &a << " " << &r; // 輸出相同位址
int& r2 = b; 是初始化 r2,非讓 r 指向 b)int& r; 編譯錯誤| 方式 | 語法 | 效果 | 典型用途 |
|---|---|---|---|
| 傳值 | void f(int x) | 複製副本,原變數不變 | 小型 POD、需修改副本 |
| 指標 | void f(int* p) | 傳遞位址,可修改原值,可為 nullptr | C 風格、選擇性輸出、陣列 |
| 參考 | void f(int& r) | 別名,必須綁定左值,不可為 null,語法乾淨 | **首選**:修改原值、避免大型物件複製 |
| 常數參考 | void f(const int& r) | 唯讀別名,可綁定暫時物件/字面值 | **首選**:大型物件唯讀傳遞 |
// 指標版
void SwapPtr(int* a, int* b) { int t=*a; *a=*b; *b=t; }
// 參考版(推薦)
void SwapRef(int& a, int& b) { int t=a; a=b; b=t; }
int x=1, y=2;
SwapRef(x, y); // 呼叫簡潔,無需 &
template
void Forward(T&& param) { // T&& 是通用參考(非右值參考)
// param 保持原值類別:左值→T&,右值→T&&
Process(std::forward(param));
}
此為 C++11 完美轉發核心,&& 在模板型別推導中觸發參考摺疊規則。
& 在**型別宣告**中 = 參考宣告子(別名)& 在**運算式**中 = 取址運算子(位址)