A operator+(A& p) { // 非 const 參考,非 const 成員函數
A tmp(n + p.n);
return tmp;
}
const A a(10); a + A(30); 編譯失敗:const A 無法綁定到非 const 參考,且無 const 版本可呼叫。
A operator+(A p) const { // 1. 成員函數加 const 2. 參數傳值 (支援臨時物件)
return A(n + p.n);
}
| 修改 | 原因 |
|---|---|
const 後置 | 允許 const A 物件調用 |
參數 A p (傳值) | 接受右值 A(30),避免綁定非 const 參考失敗;C++17 保證複製消除 (RVO) 無效能損失 |
回傳 A (非參考) | 回傳區域物件,編譯器優化為直接建構於呼叫端 |
#include <iostream>
struct A {
int n;
A() = default;
A(int n_) : n(n_) {}
A operator+(A p) const { return A(n + p.n); }
};
int main() {
A c;
const A a(10);
c = a + A(30); // OK
std::cout << c.n; // 40
}
friend A operator+(A lhs, const A& rhs) {
lhs.n += rhs.n;
return lhs;
}
支援 A + A、int + A (若有轉換建構子) 等混合運算。