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

C++ 必知必會 (五):參考是別名非指標——深度解析三大差異

     編輯:關於C++

定義與基本行為

int a = 12;
int& ra = a;      // ra 是 a 的別名
--ra;             // a 變 11
a = 10;           // ra 變 10
int* ip = &ra;    // 取址得 a 的地址

參考不是指標,雖然編譯器常以指標實現,但語意與行為截然不同。

參考 vs 指標:三大根本差異

特性參考指標
空值不存在空參考可為 nullptr
初始化宣告時必須初始化可延遲初始化
重新綁定一生綁定初始化物件,不可改變可隨時指向其他物件

空參考陷阱與防禦

雖然語法不允許空參考,但透過解參考空指標可製造:

Employee& ref = *static_cast<Employee*>(0);  // 編譯器可能檢測
Employee* getEmp();
Employee& ref = *getEmp();  // 危險!若回傳 nullptr → UB
if (&ref == 0) ...          // 檢查無意義,UB 已發生

正確做法:

Employee* emp = getEmp();
if (emp) { /* 使用 *emp 或 Employee& ref = *emp; */ }

參考作為函式參數的優勢

template<typename T>
void swap(T& a, T& b) {
    T tmp(a); a = b; b = tmp;
}
int x=1, y=2; swap(x, y);  // a 是 x 別名,b 是 y 別名,無拷貝開銷

參考賦予無名物件(如陣列元素 arr[i])方便別名:

float& r = a[i*m + j];
r = r * r + r;  // 簡化複雜索引運算,且避免重複計算

常數參考延長臨時物件壽命

const double& cd = 12.3;           // 綁定臨時 double
const std::string& s = foo() + bar(); // 綁定運算式產生的臨時物件
// 臨時物件壽命延長至參考離開作用域

非 const 參考不可綁定臨時物件/字面值:

double& d = 12.3;           // 錯誤
swap(std::string("a"), std::string("b")); // 錯誤

總結

  • 參考 = 物件別名,非指標變體。
  • 三大鐵律:無空值、必初始化、不可重綁定。
  • 優先用 const T& 傳遞大型物件,需修改用 T&,避免指標語意模糊。
  • 善用 const 參考延長臨時物件壽命,簡化資源管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved