首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 參考補充說明:初始化綁定、暫時物件與左值特性實例解析

     編輯:關於C++

一、參考基本特性

  • 參考是變數別名,初始化後不可重新綁定。
  • 無法取得參考位址:&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=)。

四、總結:參考使用黃金法則

  1. 宣告即初始化,且一生綁定同一物件。
  2. 函式參數優先用 const T&(唯讀)或 T&(需修改),避免值傳遞開銷。
  3. 傳回參考務必確保被參考物件生命週期超過呼叫端(全域、static、成員、new 配置)。
  4. 勿傳回區域物件參考;勿綁定字面值/暫時物件(除非 const T& 延長壽命)。
  5. 善用參考左值特性實作直觀介面(如 vec[i] = 10)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved