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

C++ 進階教程:以引用作為函數返回值——原理、用法與陷阱

     編輯:關於C語言

語法格式

類型標識符 &函數名 (形參列表) {
    // 函數體
}

函數名前加 & 表示返回引用。返回引用實質是返回指向返回值的隱式指針,因此引用返回值的函數可作賦值運算符左值,且內存中不產生副本。

示例 1:計數器可作左值

#include <iostream>
using namespace std;

int &func() {
    static int num = 0;
    return ++num;
}

void main() {
    for (int i=0; i<5; i++) cout << func() << '\t';
    cout << endl;
    func() = 10;                 // 作左值賦值
    for (int i=0; i<5; i++) cout << func() << '\t';
    cout << endl;
}

輸出:1 2 3 4 5 → 賦值後 11 12 13 14 15。驗證函數調用可作左值修改靜態變量。

示例 2:返回數組元素引用實現下標賦值

double array[5] = {100.1, 100.2, 100.3, 100.4, 100.5};
double &change(int i) { return array[i]; }

int main() {
    change(2) = 3.14;     // 修改 array[2]
    change(3) = -99.99;   // 修改 array[3]
    // 輸出驗證...
}

change(i) 返回 array[i] 的引用,故可作左值直接修改數組元素。注意:不存在數組的引用,但存在指向數組元素的引用。

三大禁忌(必讀)

  1. 不可返回局部/臨時變量引用:函數結束局部變量銷毀,引用成「懸空引用」。VC6 僅警告 C4172,但運行時賦值失效、行為未定義。標準編譯器甚至直接報錯。
    錯誤示例:int &func() { int i=10; return i; }
  2. 不可返回函數內 new 分配內存的引用:若返回引用未被實際變量接收(僅作臨時值),該內存無法釋放 → 內存洩漏。
  3. 返回類成員引用最好加 const:屬性常與業務規則綁定(如賦值觸發聯動),暴露非常量引用允許繞過封裝直接修改,破壞業務完整性。

掌握引用返回值,能寫出更高效、語義更豐富的 C++ 代碼,但必須嚴守對象生命周期與封裝原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved