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
Test s = a.getRef() → 調用拷貝構造函數初始化 s。Test& r = a.getRef() → r 直接綁定到 a,**零開銷**,無構造/析構。Test t; t = a.getRef() → 先默認構造 t,再調用賦值運算符。| 方式 | 構造 | 析構 | 賦值 | 適用場景 |
|---|---|---|---|---|
| 值接收 | 拷貝構造 | 1次 | 無 | 需要獨立副本、修改不影響原對象 |
| 引用接收 | 無 | 無 | 無 | 只讀訪問、避免拷貝、修改影響原對象 |
| 賦值接收 | 默認構造 | 1次 | 1次 | 已有對象需更新狀態 |
vector::front()、map::operator[] 等返回引用,正是為了支持上述三種用法:
auto x = v.front();(拷貝)、auto& r = v.front();(引用)、v.front() = val;(賦值)。
Test().getRef()) → 臨時對象析構後引用失效。