轉換建構子與轉換運算子:優先權
在C 中,轉換建構子和轉換運算子都提供了在不同類型之間轉換物件的方法。當兩者都可用於給定轉換時,了解它們的優先順序對於確定呼叫哪一個至關重要。
優先權建立
轉換建構子與轉換運算子之間的優先權是由C 標準(13.3.1.4) 定義:
重載解析用於選擇要呼叫的使用者定義轉換。候選函數選擇如下:
- 目標類型的轉換建構子(12.3.1)為候選函數。
- 來源型別及其基底類別的轉換函數,產生與目標型別相容的型別是候選函數。
運算子重寫建構子
在提供的範例程式碼中,其中轉換建構函式和A類到B類定義了轉換運算符,轉換運算子優先:
class A; class B { public: B(){} B(const A&) //conversion constructor { cout << "called B's conversion constructor" << endl; } }; class A { public: operator B() //conversion operator { cout << "called A's conversion operator" << endl; return B(); } };
這是因為,在綁定參考參數(這裡是轉換函數的隱式物件參數)時,非常量轉換函數(A&) 中的參考優先於轉換構造函數(const A&) 中的const 引用。
物件導向的哲學考量
關於哪個類別應該負責轉換物件的哲學問題,標準支援來源類別(在本例中為 A)。這符合封裝的原則,因為它允許來源類別控制轉換過程並確保結果物件(B)的正確性。
最終由開發人員自行決定決定適當的轉換機制針對具體場景,考慮封裝、抽象化、程式碼可讀性等因素。
以上是在類型之間轉換時:來源物件優先還是目標物件優先?的詳細內容。更多資訊請關注PHP中文網其他相關文章!