引用是 C++ 新增特性,語意上是變量別名(如古人「字」「號」),操作引用等同操作變量本身。雖無指針操作符,但看似與指針無異。引用存在的價值在於提供指針無法完成的功能(詳後)。
int i; int &j; // 錯誤 int &k=i; // 正確。如同起外號必須針對具體對象。extern int &i; // 正確int &i=j; i=k; // 錯誤!實為賦值 k 給 j。引用類似 int* const p,不可改指向。&i 等同 &j,即被引用變量地址,無「引用地址」概念。除指針外,引用也能產生多態:基類引用可綁定派生類實例。若基類有虛函數且派生類重寫,通過基類引用調用即產生多態效果。
C/C++ 參數傳值。大對象傳遞用指針避免壓棧開銷,引用提供同等效率的替代選擇:無論對象大小,參數傳遞僅壓棧 4 字節 (32位)。
應盡量定為 const: 非 const 引用參數無法綁定臨時對象(如 bar(foo())、bar("hello")),因臨時對象為 const。定為 const string& 則通用。
三條鐵律:
new 內存的引用: 雖無銷毀問題,但若返回值未被實際變量接收(作臨時值),將導致內存洩漏。<</>> 返回值: 需支持鏈式調用 cout << "hello" << endl;。返回對象會導致拷貝構造(針對不同對象),返回指針無法鏈式用 <<,唯有返回流引用。= 返回值: 支持鏈式賦值 x = j = 10 或 (x=10)=100,必須返回左值,引用是唯一選擇。這體現了引用的不可替代性。+ - * /: 無副作用,必須構造新對象返回。可選方案:返回對象(正確)、返回局部引用/新內存引用/靜態引用(均錯誤,靜態引用會導致 (a+b)==(c+d) 永真)。catch 參數必須用: 流操作符/賦值操作符返回值、拷貝構造/賦值操作符參數。
推薦用: 大對象參數、容器元素訪問、成員訪問、持久對象返回。
禁用: 四則運算符返回值。