Heim >Backend-Entwicklung >C++ >Warum hat der Konvertierungsoperator beim Konvertieren eines Objekts von einem Typ in einen anderen Vorrang vor dem Konvertierungskonstruktor?
In der objektorientierten Programmierung erleichtern Konvertierungskonstruktoren und -operatoren die Transformation von Objekten von einem Typ in einen anderen. Es können jedoch Szenarien auftreten, in denen mehrere praktikable Konvertierungspfade vorhanden sind, sodass sich die Frage stellt, welcher Vorrang hat.
Im angegebenen Codeausschnitt wird der Konvertierungsoperator aufgerufen, wenn ein A-Objekt einer B-Variablen zugewiesen wird (B b = A();, obwohl sowohl ein Konvertierungsoperator als auch ein Konvertierungskonstruktor vorhanden sind. Die folgenden Abschnitte befassen sich mit der Begründung dieses Verhaltens und seinen philosophischen Implikationen.
Der C-Standard legt in Abschnitt 13.3.1.4 den Vorrang für die Lösung mehrdeutiger Konvertierungsaufrufe fest besagt, dass die Überlastungsauflösung verwendet wird, um die „beste“ benutzerdefinierte Konvertierung auszuwählen. In diesem Fall umfassen Kandidatenfunktionen sowohl den Konvertierungskonstruktor von B als auch den Konvertierungsoperator von A.
Wenn Quell- und Zieltyp unterschiedliche Klassen (S und T) sind, initialisiert der Compiler ein Objekt vom Typ T ( durch Kopierinitialisierung) durch Anwendung einer Reihe von Konvertierungsschritten. Der Standard berücksichtigt sowohl die Konvertierungsfunktionen von S als auch seine Basisklassen. Die Konvertierungsfunktion, die ohne zusätzliche CV-Qualifizierer einen passenden oder von T abgeleiteten Typ ergibt, wird zum Kandidaten. Dieser Schritt führt in unserem Fall zur Auswahl der Operatoren B() und B(const A&) als Kandidaten.
Anschließend wendet der C-Standard die Überlastungsauflösung an, um die beste Übereinstimmung für die Argumente zu ermitteln. Die Argumentliste besteht in diesem Fall aus dem Initialisierungsausdruck. In unserem Code ist das Argument ein A-Objekt, bei dem es sich um einen L-Wert handelt.
Der entscheidende Faktor bei der Bestimmung der Priorität ist in Abschnitt 13.3.3.2/3 zusammengefasst: „Wenn zwei Kandidatenfunktionen beide Referenzbindungen sind und auf sie verweisen.“ Bei kompatiblen Typen wird derjenige mit der geringsten CV-Qualifikation in der Referenz bevorzugt ist eine Mitgliedsfunktion, während B(const A&) eine konstante Referenz annimmt. Da Operator B() weniger konstante Qualifikationen aufweist, wird er vom Compiler als überlegener Kandidat ausgewählt, was zum Aufruf des Konvertierungsoperators führt.
Objektorientierte philosophische Implikationen
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!