引用作為函數參數可避免拷貝、提升效率且比指標安全。但在同一作用域內定義引用(如 int &ri = i;)似乎多餘,實則有獨特價值。
網絡編程中常見巢狀結構(如 BSD mbuf),訪問深層成員需冗長路徑 M_dat.MH.MH_dat.MH_databuf。傳統用宏定義扁平化:
#define m_pktdat M_dat.MH.MH_dat.MH_databuf
但宏有作用域污染、側效應等缺點。C++ 可用引用在使用點建立別名:
mbuf m;
m_ext &MH_ext = m.M_dat.MH.MH_dat.MH_ext;
// 後續直接用 MH_ext 操作深層成員
const m_ext &c_ref = m.M_dat.MH.MH_dat.MH_ext; // 唯讀別名
亦可用於封裝 Getter 返回引用的情況:auto &ref = obj.GetDeepMember(); 避免重複調用。
引用即「別名」。例如雙層迴圈索引 i, j 語義不明:
const int width = 10, height = 10;
int i = 0, j = 0;
int &line = i, &row = j;
for (line = 0; line < height; ++line)
for (row = 0; row < width; ++row)
a[line][row] = 0; // 行/列語義清晰
若必須使用他人定義的無意義變量名,引用別名能大幅改善可讀性。
利用引用作為公開介面直接綁定私有成員:
class CA {
int m_i;
public:
int &i; // 可讀寫屬性
const int &c_i; // 唯讀屬性
CA() : i(m_i), c_i(m_i) {}
};
使用時 CA a; a.i = 8; int b = a.i; 像操作屬性一樣直觀。缺點:VC6 以指標實現引用,導致類體積膨脹;期待現代編譯器優化。
引用是 C++ 的特色工具,除參數傳遞外,在代碼簡化、語義表達、介面設計上均有妙用,值得深入挖掘。