代碼還原
double array[5] = {100.1, 100.2, 100.3, 100.4, 100.5};
double &change(int i) { return array[i]; }
void test() {
change(2) = 3.14; // ✅ 修改 array[2]
change(3) = -99.99; // ✅ 修改 array[3]
double c = change(1); // ❌ c 是拷貝,非引用
c = 3.5; // 僅修改局部變量 c
}
本質區別
| 表達式 | 類型 | 行為 |
change(2) = 3.14 | 左值引用 | 直接綁定 array[2],賦值透傳 |
double c = change(1) | 值初始化 | 調用拷貝構造,**斷開引用鏈** |
內存模型圖解
change(2) = 3.14 等價於:
double &temp = array[2]; // temp 是 array[2] 別名
temp = 3.14; // 直接改 array[2]
double c = change(1) 等價於:
double &temp = array[1]; // temp 綁定 array[1]
double c = temp; // c 開闢新空間,複製值
c = 3.5; // 僅改 c,array[1] 不變
引用核心規則
- 引用**不是對象**,不佔內存,本質是別名
- 初始化後**不可重新綁定**
- 作為返回值時,返回的是被引用對象的**別名資格**
- 用於初始化**非引用變量**時發生**值拷貝**
正確修改模式
// 方式 1:返回引用並直接賦值
change(1) = 3.5; // ✅ 直接改 array[1]
// 方式 2:用引用接收
double &ref = change(1);
ref = 3.5; // ✅ 同樣改 array[1]