需用類 B 的物件隱式構造類 A 的物件。常規做法在 A 增加轉換構造函數 A(const B&),但受限於:
B 的私有成員需訪問,而 B 未宣告 A 為友元。A 為第三方庫類別,無法修改定義。operator A()在 源類別 B 中定義 目標類別 A 的轉換函數:
[cpp]
class A {
public:
A(int n) : a(n) {}
void Print() { cout << a << endl; }
private:
int a;
};
class B {
public:
// 關鍵:轉換操作符,無返回類型,參數列為空
operator A() const {
return A(b); // 訪問 B 私有成員 b 構造 A
}
void SetVal(int a) { b = a; }
private:
int b;
};
[cpp]
int main() {
B objB;
objB.SetVal(5);
A objA(objB); // 隱式調用 objB.operator A()
objA.Print(); // 輸出 5
vector vecA;
vecA.push_back(objB); // 隱式轉換後放入 vector
vecA[0].Print(); // 輸出 10 (若 objB.SetVal(10) 後)
return 0;
}
operator TypeName() const — 無返回類型聲明,const 修飾表示不修改源物件。explicit 禁止隱式轉換,需顯式 static_cast(objB) 或 A(objB),減少驚喜行為。A 也有 operator B(),表達式可能產生歧義導致編譯錯誤。toA()、AsA(),語意更清晰,避免隱式轉換陷阱。operator bool() 用於 if (ptr) 判斷。String::operator const char*())。