自定義類別 Test 需支援與 int 相加:
class Test {
int a;
public:
Test(int v) : a(v) {}
friend Test operator+(Test&, int); // Test + int
// friend Test operator+(int, Test&); // int + Test 需額外定義
};
若 operator+ 為成員函數,第一個參數隱式為 this,**無法**將 int 放在前面,導致 10 + obj 編譯失敗。
Test operator+(Test& lhs, int rhs) { return Test(lhs.a + rhs); }
inline Test operator+(int lhs, Test& rhs) { return rhs + lhs; } // 轉發
缺點:每新增一種混合型別就需成對定義,代碼冗餘、維護成本高。
利用單參數建構函數 Test(int) 將 int **隱式轉換**為 Test 暫時物件,統一走 Test + Test 多載:
class Test {
int a;
public:
Test(int v = 0) : a(v) {} // 非 explicit,允許隱式轉換
friend Test operator+(const Test&, const Test&); // 統一介面
int get() const { return a; }
};
Test operator+(const Test& lhs, const Test& rhs) {
return Test(lhs.a + rhs.a); // 返回無名物件
}
int main() {
Test a(100);
a = a + 10; // 10 → Test(10) → operator+(Test, Test)
a = Test(10) + a; // 顯式建構無名物件
a = 50 + 1; // 50+1=51 → Test(51) → 隱式轉換賦值
cout << a.get(); // 151
}
a + 10 │ ├─ 10 隱式轉換 → Test(10) (無名物件,右值) │ ├─ operator+(const Test&, const Test&) 匹配 │ └─ 返回 Test(110) (無名物件) → 移動賦值給 a
class Test {
int a;
public:
Test(int v = 0) : a(v) {}
Test operator+(const Test& rhs) const { // this 隱式為第一參數
return Test(a + rhs.a);
}
int get() const { return a; }
};
int main() {
Test a(100);
a = a + Test(10); // 顯式建構
a = Test(10) + a; // 無名物件呼叫 operator+
a = 50 + 1; // int 運算後隱式轉換
}
關鍵點:成員 operator+ 接受 const Test&,**無名物件可綁定到 const 引用**,完美解決參數順序問題。
class Test {
int a;
public:
explicit Test(int v = 0) : a(v) {} // 禁止隱式轉換
Test operator+(const Test& rhs) const { return Test(a + rhs.a); }
int get() const { return a; }
};
int main() {
Test a(100);
a = a + Test(10); // 必須顯式建構
a = Test{10} + a; // C++11 列表初始化
// a = a + 10; // 編譯錯誤:explicit 禁止隱式轉換
}
explicit 防止意外隱式轉換(如 void foo(Test) 呼叫 foo(10)),但需在運算子多載處顯式建構無名物件。
return Test(...) 觸發 **RVO (Return Value Optimization)**,編譯器直接在呼叫端儲存空間建構,零拷貝。Test 擁有移動建構子,移動 int 成員極廉價。Test + Test 單一多載**(成員或友元),參數用 const Test&。Test(int)**(非 explicit 允許隱式,explicit 需顯式建構)。const Test&。explicit 控制隱式轉換範圍,平衡便利與安全。**核心思想**:用建構函數統一型別轉換入口,用無名物件承載臨時運算結果,用單一多載處理核心邏輯——這正是 C++ 型別系統與物件模型協同設計的精髓體現。