Heim > Artikel > Backend-Entwicklung > Warum hat der Konvertierungsoperator beim Konvertieren eines Objekts von einem Typ in einen anderen Vorrang vor dem Konvertierungskonstruktor?
在物件導向程式設計中,轉換建構子和運算子有助於將物件從一種類型轉換為另一種類型。但是,可能會出現存在多個可行轉換路徑的情況,從而提出哪一個優先的問題。
在給定的程式碼片段中,在將 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() 由於是成員函數而採用A 類型的左值,而B(const A&) 採用const 引用。由於運算子 B() 的 const 限定較少,因此它被編譯器選為最佳候選,從而呼叫轉換運算子。
來自哲學從角度來看,A 或 B 是否對如何進行轉換有更多了解的選擇是值得商榷的。
Einerseits könnte man argumentieren, dass B (der Zieltyp) die sachkundigere Partei ist, da sie dafür verantwortlich ist, zu definieren, wie sie sich aus einem A-Objekt konstruieren soll. Der Konvertierungskonstruktor in B kann spezifische Konvertierungsregeln oder Validierungen kapseln.
Andererseits könnte man dafür plädieren, dass A (der Quelltyp) einen besseren Einblick in seine eigene Darstellung besitzt und wie er als B interpretiert werden kann Objekt. Der Konvertierungsoperator in A ermöglicht es dem Objekt, zu steuern, wie es in B umgewandelt wird.
Letztendlich hat sich der C-Standard für den Ansatz entschieden, bei dem der Konvertierungsoperator Vorrang hat und der Darstellung des Quellobjekts Vorrang einräumt. Diese Wahl steht im Einklang mit der Vorstellung, dass das Objekt selbst das beste Verständnis für seinen eigenen internen Zustand hat und weiß, wie es in andere Typen konvertiert werden kann. Es ist jedoch wichtig zu beachten, dass diese Vorrangregel den Regeln der Überlastungsauflösung unterliegt, wobei die endgültige Entscheidung durch andere Faktoren wie die Konstantenqualifikation beeinflusst werden kann, wie in unserem Beispielcode gezeigt.
Das obige ist der detaillierte Inhalt vonWarum hat der Konvertierungsoperator beim Konvertieren eines Objekts von einem Typ in einen anderen Vorrang vor dem Konvertierungskonstruktor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!