在物件導向程式設計中,轉換建構子和運算子有助於將物件從一種類型轉換為另一種類型。但是,可能會出現存在多個可行轉換路徑的情況,從而提出哪一個優先的問題。
在給定的程式碼片段中,在將 A 物件指派給 B 變數(B b = A();),儘管同時存在轉換運算子和轉換建構子。以下部分深入探討了這種行為背後的基本原則及其哲學意義。
C 標準在第13.3.1.4 節中建立了解決不明確轉換呼叫的優先權,其中聲明使用重載解析來選擇「最佳」用戶定義的轉換。在這種情況下,候選函數既包括 B 的轉換構造函數,也包括 A 的轉換運算子。
當來源類型和目標類型是不同的類別(S 和 T)時,編譯器會初始化類型 T 的物件(透過複製初始化)透過應用一系列轉換步驟。該標準考慮了 S 及其基底類別的轉換函數。產生類型符合或從 T 衍生而無需附加 cv 限定詞的轉換函數成為候選函數。此步驟導致選擇運算子 B() 和 B(const A&) 作為我們案例中的候選者。
隨後,C 標準應用重載解析來確定參數的最佳匹配。參數清單由該實例中的初始值設定項表達式組成。在我們的程式碼中,參數是一個 A 對象,它是一個左值。
決定優先順序的關鍵因素封裝在第13.3.3.2/3 節:「如果兩個候選函數都是引用綁定並且引用相容的類型,引用上具有最少cv 限定的類型是首選。由於運算子 B() 的 const 限定較少,因此它被編譯器選為最佳候選,從而呼叫轉換運算子。
物件導向的哲學意義
D'une part, on pourrait affirmer que B (le type cible) est la partie la plus compétente car elle est chargée de définir comment se construire à partir d'un objet A. Le constructeur de conversion dans B peut encapsuler des règles de conversion ou des validations spécifiques.
D'un autre côté, on pourrait préconiser que A (le type source) possède une meilleure compréhension de sa propre représentation et de la manière dont elle peut être interprétée comme un B. objet. L'opérateur de conversion dans A permet à l'objet de contrôler la manière dont il est transformé en B.
Au final, le standard C a opté pour l'approche où l'opérateur de conversion est prioritaire, donnant la priorité à la représentation de l'objet source. Ce choix s'aligne sur l'idée selon laquelle l'objet lui-même possède la meilleure compréhension de son propre état interne et de la manière dont il peut être converti en d'autres types. Cependant, il est essentiel de noter que cette règle de priorité est soumise aux règles de résolution de surcharge, selon lesquelles la décision finale peut être influencée par d'autres facteurs tels que la qualification const, comme le démontre notre exemple de code.
以上是將物件從一種類型轉換為另一種類型時,為什麼轉換運算子優先於轉換建構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!