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

C++ 成員函數返回引用的三種接收方式:拷貝構造、引用綁定、賦值操作深度對比

     編輯:關於C++

實驗代碼


class Test {
public:
    Test() { cout << "Test\n"; }
    ~Test() { cout << "~Test\n"; }
    Test(const Test&) { cout << "Copy Ctor\n"; }
    Test& operator=(const Test&) { cout << "Assign\n"; return *this; }
    Test& getRef() { return *this; }
};

int main() {
    Test a;
    cout << "#1#\n";
    Test s = a.getRef();  // 1. 拷貝構造
    cout << "#2#\n";
    Test& r = a.getRef(); // 2. 引用綁定
    cout << "#3#\n";
    Test t; t = a.getRef(); // 3. 默認構造 + 賦值
    return 0;
}

輸出與分析


Test
#1#
Copy Ctor
#2#
#3#
Test
Assign
~Test
~Test
~Test

  • #1:Test s = a.getRef() → 調用拷貝構造函數初始化 s。
  • #2:Test& r = a.getRef() → r 直接綁定到 a,**零開銷**,無構造/析構。
  • #3:Test t; t = a.getRef() → 先默認構造 t,再調用賦值運算符。

性能與語義對比

方式構造析構賦值適用場景
值接收拷貝構造1次無需要獨立副本、修改不影響原對象
引用接收無無無只讀訪問、避免拷貝、修改影響原對象
賦值接收默認構造1次1次已有對象需更新狀態

STL 容器的啟示

vector::front()、map::operator[] 等返回引用,正是為了支持上述三種用法:
auto x = v.front();(拷貝)、auto& r = v.front();(引用)、v.front() = val;(賦值)。

避坑指南

  • 返回局部對象引用 → **懸垂引用**,未定義行為。
  • 返回臨時對象引用(如 Test().getRef()) → 臨時對象析構後引用失效。
  • 多線程環境下引用接收需加鎖,防止數據競爭。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved