引用是變數的別名,不佔用獨立記憶體,與原變數共享同一地址。類似 Windows 快捷方式或人的綽號。
型別 &引用名 = 被引用變數; // 必須初始化,且不可改變綁定
& 在定義時表示引用宣告,使用時表示取地址const 變數的初始化規則int a = 99; int &b = a; cout << a << ", " << b << endl; // 99, 99 cout << &a << ", " << &b << endl; // 0x28ff44, 0x28ff44 (地址相同) b = 47; cout << a << ", " << b << endl; // 47, 47 (修改引用影響原變數)
const int &ref = value; // 或 int const &ref = value; // ref = 10; // 編譯錯誤:不可修改
const int &r = 10; (延長臨時物件壽命)const Type& 避免拷貝且防修改void swap1(int a, int b) { ... } // 值傳遞:無法修改外部
void swap2(int *p1, int *p2) { ... } // 指針傳遞:可修改,語法繁瑣
void swap3(int &a, int &b) { ... } // 引用傳遞:可修改,語法直觀
int main() {
int num1, num2;
cin >> num1 >> num2;
swap1(num1, num2); cout << num1 << " " << num2 << endl; // 未交換
swap2(&num1, &num2); cout << num1 << " " << num2 << endl; // 交換成功
swap3(num1, num2); cout << num1 << " " << num2 << endl; // 交換成功
}
| 方式 | 可修改外部 | 調用語法 | 效能 |
|---|---|---|---|
| 值傳遞 | 否 | f(x) | 拷貝開銷 |
| 指針 | 是 | f(&x) | 間接訪問 |
| 引用 | 是 | f(x) | 零開銷別名 |
int &plus10(int &n) {
n += 10;
return n; // 返回引用,無拷貝
}
int &bad_plus10(int &n) {
int m = n + 10;
return m; // 錯誤!返回區域變數引用
}
後果:函數結束,區域變數銷毀,返回懸空引用 → 未定義行為(不同編譯器表現不同)。
warning: returning reference to local variable
| 特性 | 引用 | 指針 |
|---|---|---|
| 本質 | 別名(編譯期概念) | 地址值(運行期實體) |
| 初始化 | 必須定義時初始化 | 可延遲/重新賦值 |
| 空值 | 無空引用(必須綁定實體) | 可為 nullptr |
| 運算 | 透明(如同原變數) | 需解引用 *p |
| 記憶體 | 不佔用(通常優化掉) | 佔用指針大小 |
| 重新綁定 | 不可 | 可 |
for (auto& x : v)const T&:避免拷貝、防修改、接受臨時物件T&:明確語意、避免指針T&&:移動語意、完美轉發,進階主題引用是 C++ 相對 C 的關鍵擴展:零開銷別名,同時實現高效參數傳遞與直觀修改外部變數。核心鐵律:必須初始化、終身綁定、不返回區域引用。掌握 const T& 輸入參數慣用法、引用返回值優化、與指針的本質區別,是寫出高效、安全、現代 C++ 代碼的基石。