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

C++引用完整指南:本質、規則與最佳實踐

     編輯:C++ 入門

引用本質

引用是**對象的別名**,非指針。編譯器實現通常為常量指針,但語義完全不同。

引用 vs 指針

特性引用指針
空值**不存在空引用**可為nullptr
初始化**聲明時必須初始化**可延遲初始化
重新綁定**不可**改變指向對象可隨時修改指向
語法像對象一樣使用需解引用`*`/`->`
sizeof被引用對象大小指針大小(4/8字節)
層次無多級引用多級指針`**p`

基本用法


int a = 10;
int& ra = a;      // ra是a的別名
ra = 20;          // a變為20
int* pa = &ra;    // 取址得到a的地址
int& rra = ra;    // 別名的別名仍是a的別名

函數參數傳遞

傳值 vs 傳引用


void swap(int& a, int& b) { // 引用參數,可修改實參
    int t = a; a = b; b = t;
}
void func(const BigObject& obj) { // const引用,避免拷貝大對象
    // 只讀訪問
}

引用返回值


int& getElement(vector& v, int i) { return v[i]; }
// 用法:getElement(v, 0) = 100; // 修改元素

const引用綁定臨時對象


const int& cri = 10;          // 合法:const引用延長臨時對象壽命
const double& crd = 3.14;     // 合法:甚至可綁定類型轉換產生的臨時量
string& sr = string("hello"); // 非法:非常量引用不能綁定臨時對象
const string& csr = string("hello"); // 合法

引用作為類成員


class RefHolder {
    int& ref; // 必須在構造函數初始化列表中初始化
public:
    RefHolder(int& r) : ref(r) {}
};

常見陷阱

  • **懸空引用**:返回局部對象的引用
    int& bad() { int x=10; return x; } // 錯誤!x銷毀後引用無效
  • **引用成員未初始化**:編譯錯誤
  • **引用數組不存在**:`int& arr[10];` 非法

最佳實踐

  1. **函數參數**:大對象/不可拷貝對象用 `const T&`,需修改用 `T&`
  2. **返回值**:運算符重載(`+=`等)返回 `T&`,工廠函數勿返回局部引用
  3. **範圍for**:`for(auto& x : v)` 修改元素,`for(const auto& x : v)` 只讀避免拷貝
  4. **別名模板**:`using Ref = T&;` 簡化複雜類型聲明
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved