原來這麼簡單:C++引用(&)的基礎用法

在C++中,引用(&)是一個非常重要的概念,它能讓我們更高效地操作變量,避免不必要的數據拷貝。但對於初學者來說,引用的語法和使用場景可能有點抽象。別擔心,今天我們就用最簡單的方式,從“是什麼”“怎麼用”“注意啥”三個方面,把引用的基礎用法講清楚。

一、引用到底是什麼?

想象一下,你有一個好朋友叫“小明”,但他有個外號叫“明哥”。你用“小明”或“明哥”叫他,指的都是同一個人。C++的引用就像這個“外號”——引用是變量的“別名”,和原變量共享同一塊內存空間,修改引用的值,就等於修改原變量的值。

比如:

int a = 10;   // 定義變量a,值爲10
int &b = a;   // 定義引用b,它是a的別名
a = 20;       // 修改原變量a
cout << b;    // 輸出b:20(因爲b是a的別名,所以和a的值一樣)

這裏,b就是a的引用,ba本質上是同一個東西。

二、引用的基本用法

1. 定義與初始化

引用必須在定義時綁定到一個已存在的變量,不能“空着”或者“臨時綁定”。語法是:類型 &引用名 = 原變量;

正確示例

int x = 5;
int &y = x;   // y是x的引用,綁定成功

錯誤示例(初學者常犯):

int &z;       // 錯誤!引用必須初始化,不能未定義
int &w = 10;  // 錯誤!普通引用不能綁定到臨時常量(10是臨時變量)

2. 引用作爲函數參數

當函數參數是引用時,函數內部對引用的修改會直接反映到原變量上(避免了“傳值”時的拷貝開銷)。

場景:交換兩個變量的值

// 普通傳值(會拷貝x和y的值,修改的是副本)
void swap_value(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

// 傳引用(直接修改原變量x和y)
void swap_ref(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1, y = 2;
    swap_value(x, y);  // x和y的值沒變(swap_value修改的是副本)
    cout << "x=" << x << ", y=" << y << endl;  // 輸出:x=1, y=2

    swap_ref(x, y);    // x和y的值被交換
    cout << "x=" << x << ", y=" << y << endl;  // 輸出:x=2, y=1
    return 0;
}

關鍵點:傳引用時,函數參數和實參直接綁定,無需額外拷貝,效率更高。

3. 引用作爲函數返回值

函數返回引用時,返回的是原變量的引用,不是拷貝。但要注意:不能返回局部變量的引用(局部變量在函數結束後會被銷燬,返回引用會導致未定義行爲)。

正確示例:返回全局/靜態變量的引用

int global = 100;  // 全局變量

int &func() {
    return global;  // 返回全局變量的引用
}

int main() {
    func() = 200;    // 修改返回的引用,即修改global的值
    cout << global;  // 輸出:200
    return 0;
}

錯誤示例:返回局部變量的引用

int &bad_func() {
    int temp = 10;   // 局部變量,函數結束後會被銷燬
    return temp;     // 錯誤!返回已銷燬變量的引用
}

int main() {
    int &a = bad_func();  // 這裏會得到垃圾值(未定義行爲)
    cout << a;           // 輸出可能是隨機數
    return 0;
}

4. const引用(常量引用)

const修飾的引用稱爲“常量引用”,它有兩個作用:
- 綁定臨時變量(普通引用不行);
- 防止通過引用修改原變量(只讀操作)。

示例1:綁定臨時變量

// 普通引用不能綁定臨時變量(int &c = 5; 會報錯)
const int &c = 5;   // 合法!常量引用可以綁定臨時變量(臨時變量被存儲)
cout << c;          // 輸出:5

// 常量引用也可綁定表達式結果
int x = 10, y = 20;
const int &d = x + y;  // x+y是臨時變量,d是它的引用
cout << d;            // 輸出:30

示例2:防止修改原變量

void print(const int &a) {  // 函數參數是const引用,無法修改a
    // a = 30;  // 錯誤!const引用不能修改值
    cout << a;
}

int main() {
    int b = 20;
    print(b);  // 輸出:20
    return 0;
}

三、引用 vs 指針:別再搞混了!

引用和指針都能實現變量的間接訪問,但語法和使用場景有區別:

特性 引用(&) 指針(*)
定義 int &a = b;(必須初始化) int *a = &b;(可初始化也可不初始化)
空值 不能爲null(必須綁定變量) 可以爲null(int *a = nullptr;
指向變化 初始化後無法改變指向 可隨時改變指向(a = &c;
解引用 無需解引用(直接用a 需要解引用(*a
語法簡潔性 更直觀(a = 10; 稍複雜(*a = 10;

一句話總結:引用是“變量的別名”,指針是“變量的地址”,引用更安全、更簡潔,適合作爲參數/返回值;指針更靈活,適合動態內存管理(如new/delete)。

四、新手必看的3個注意事項

  1. 引用必須初始化int &a; 會直接報錯,必須寫成 int &a = b;
  2. 別返回局部變量引用:局部變量函數結束後會銷燬,返回引用會導致“野引用”。
  3. const引用的特殊用途:綁定臨時變量時必須用const,否則編譯報錯。

五、總結

引用是C++中非常實用的特性,它讓我們能更高效地操作變量。核心記住:
- 引用是變量的“別名”,和原變量共享內存;
- 傳引用能避免拷貝,提高效率;
- 返回引用時注意別返回局部變量;
- const引用可綁定臨時變量,且只讀。

剛開始可能會覺得有點繞,但多寫幾個例子(比如交換函數、const引用綁定),很快就能掌握啦!下一篇我們會結合類和函數深入講引用的高級用法,敬請期待~

小夜