參考是變數的別名,對參考的操作等同於直接操作目標變數。宣告語法:型別 &參考名 = 目標變數;
int a; int &ra = a; // ra 是 a 的別名 ra = 1; // 等同於 a = 1
& 在此非取址運算子,而是宣告標識&ra == &a取代 C 語言指標傳遞,避免大型物件拷貝開銷,語法更清晰。
void Swap(int &a, int &b) {
int tmp = a; a = b; b = tmp;
}
int main() {
int x = 10, y = 20;
Swap(x, y); // 直接傳變數,無需取址
}
優點:
&const 可防止誤修改(const int &ref)void Print(const string &s); // 保護資料不被修改
Print("hello"); // 合法:臨時物件可綁定到 const 參考
Print(string("world")); // 合法
非 const 參考無法綁定臨時物件,這是 C++ 型別安全機制。
float &GetValue(); // 宣告回傳參考
優點:避免回傳值拷貝。但必須遵守鐵律:
new 記憶體參考:易造成記憶體洩漏const)串流運算子 <<、>>、指派運算子 = 必須回傳參考以支援鏈式操作:
ostream& operator<<(ostream& os, const MyClass& obj) {
os << obj.data;
return os; // 回傳參考支援 cout << a << b << c;
}
MyClass& MyClass::operator=(const MyClass& rhs) {
data = rhs.data;
return *this; // 回傳 *this 參考支援 a = b = c;
}
基類參考可綁定派生類物件,配合虛函數實現多態:
class Base { virtual void Foo() {} };
class Derived : public Base { void Foo() override {} };
Derived d;
Base &ref = d; // 基類參考指向派生類
ref.Foo(); // 呼叫 Derived::Foo()
| 特性 | 參考 | 指標 |
|---|---|---|
| 語法 | 直接操作目標 | 需解參考 *ptr |
| 重新綁定 | 不可 | 可隨時指向新位址 |
| 空值 | 不可為 null | 可為 nullptr |
| 記憶體 | 不佔空間 | 佔指標大小 |
| 適用場景 | 函數參數、回傳值、運算子多載 | 動態記憶體、可選參數、資料結構 |
const T&,需修改才用 T&const T&<<、>>、= 回傳 T&+ - * / 回傳 T(由值),絕不回傳參考