&ref 等同 &target。void& 或參考陣列 int& arr[10]。int a=10, b=20;
int& rn = a;
cout << rn << "|" << a << endl; // 10|10
cout << &rn << "|" << &a << endl; // 位址相同
rn = b; // 實為 a = b,非重新綁定!
cout << &rn << "|" << &a << "|" << &b << endl; // 位址仍同 a
rn = 100; // 修改 a
cout << a << "|" << b << endl; // 100|20
普通函式傳回值時,編譯器在堆疊建立暫時物件 作為副本,傳回該副本。
| 函式宣告 | 接收端 | 暫時物件 | 備註 |
|---|---|---|---|
float test() | float v | 是 | 值傳回 → 暫時物件 → 複製給 v |
float test() | float& v | 是 | 綁定暫時物件(BCB 允許延長壽命,VC 錯誤) |
float& test() | float v | 否 | 直接傳回參考,無暫時物件(推薦) |
float& test() | float& v | 否 | 直接綁定原物件,效能最佳 |
// 1. 普通傳回值給變數
float test(float a,float b) { c=a*b; return c; }
float v = test(3,1.2); // 產生暫時物件
// 2. 普通傳回值給參考(危險)
float& v = test(3,1.2); // v 綁定暫時物件,函式結束後成懸空參考
// 3. 傳回參考給變數(安全高效)
float& test(float a,float b) { c=a*b; return c; }
float v = test(3,1.2); // 直接複製 c 的值,無暫時物件
// 4. 傳回參考給參考(最佳)
float& v = test(3,1.2); // v 直接別名 c
關鍵警告: 若傳回參考指向區域變數或已釋放堆疊記憶體,將導致未定義行為(同傳回區域指標)。
傳回參考的函式呼叫本身可作為左值:
float& test(float a,float b) { c=a*b; return c; }
float& pn = test(3,1.2);
test(3,1.2) = 12.1; // 合法!修改 c 為 12.1
cout << pn; // 輸出 12.1
原理:test() 傳回 c 的參考,等同 c = 12.1。此特性常用於運算子多載(如 operator[]、operator=)。
const T&(唯讀)或 T&(需修改),避免值傳遞開銷。const T& 延長壽命)。vec[i] = 10)。