引用是**對象的別名**,非指針。編譯器實現通常為常量指針,但語義完全不同。
| 特性 | 引用 | 指針 |
|---|---|---|
| 空值 | **不存在空引用** | 可為nullptr |
| 初始化 | **聲明時必須初始化** | 可延遲初始化 |
| 重新綁定 | **不可**改變指向對象 | 可隨時修改指向 |
| 語法 | 像對象一樣使用 | 需解引用`*`/`->` |
| sizeof | 被引用對象大小 | 指針大小(4/8字節) |
| 層次 | 無多級引用 | 多級指針`**p` |
int a = 10;
int& ra = a; // ra是a的別名
ra = 20; // a變為20
int* pa = &ra; // 取址得到a的地址
int& rra = ra; // 別名的別名仍是a的別名
void swap(int& a, int& b) { // 引用參數,可修改實參
int t = a; a = b; b = t;
}
void func(const BigObject& obj) { // const引用,避免拷貝大對象
// 只讀訪問
}
int& getElement(vector& v, int i) { return v[i]; }
// 用法:getElement(v, 0) = 100; // 修改元素
const int& cri = 10; // 合法:const引用延長臨時對象壽命
const double& crd = 3.14; // 合法:甚至可綁定類型轉換產生的臨時量
string& sr = string("hello"); // 非法:非常量引用不能綁定臨時對象
const string& csr = string("hello"); // 合法
class RefHolder {
int& ref; // 必須在構造函數初始化列表中初始化
public:
RefHolder(int& r) : ref(r) {}
};
int& bad() { int x=10; return x; } // 錯誤!x銷毀後引用無效