Konvertierungskonstruktor vs. Konvertierungsoperator: Vorrang
In C bieten sowohl Konvertierungskonstruktoren als auch Konvertierungsoperatoren Möglichkeiten, Objekte zwischen verschiedenen Typen zu konvertieren. Wenn beide für eine bestimmte Konvertierung verfügbar sind, ist es wichtig, ihre Priorität zu verstehen, um zu bestimmen, welche aufgerufen wird.
Prioritätsfestlegung
Die Priorität zwischen Konvertierungskonstruktoren und Konvertierungsoperatoren ist definiert durch den C-Standard (13.3.1.4):
Überladungsauflösung wird verwendet, um die aufzurufende benutzerdefinierte Konvertierung auszuwählen. Kandidatenfunktionen werden wie folgt ausgewählt:
- Konvertierende Konstruktoren (12.3.1) des Zieltyps sind Kandidatenfunktionen.
- Konvertierungsfunktionen des Quelltyps und seiner Basisklassen, die a ergeben Typ, der mit dem Zieltyp kompatibel ist, sind Kandidatenfunktionen.
Operator überschreibender Konstruktor
Im bereitgestellten Beispielcode, in dem sowohl ein Konvertierungskonstruktor als auch ein Konvertierungsoperatoren sind für die Klassen A bis B definiert, der Konvertierungsoperator hat Vorrang:
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(); } };
Dies liegt daran, dass beim Binden von Referenzparametern (hier der implizite Objektparameter der Konvertierungsfunktion) die nicht konstanten Die Referenz in der Konvertierungsfunktion (A&) hat Vorrang vor der const-Referenz im Konvertierungskonstruktor (const A&).
Objektorientierte philosophische Überlegungen
Bezüglich der Bei der philosophischen Frage, welche Klasse für die Konvertierung eines Objekts verantwortlich sein soll, stellt sich der Standard auf die Seite der Quellklasse (in diesem Fall A). Dies steht im Einklang mit dem Prinzip der Kapselung, da es der Quellklasse ermöglicht, den Konvertierungsprozess zu steuern und die Korrektheit des resultierenden Objekts (B) sicherzustellen.
Es liegt letztendlich im Ermessen des Entwicklers, den geeigneten Konvertierungsmechanismus zu bestimmen für ein bestimmtes Szenario unter Berücksichtigung von Faktoren wie Kapselung, Abstraktion und Codelesbarkeit.
Das obige ist der detaillierte Inhalt vonBeim Konvertieren zwischen Typen: Hat das Quell- oder Zielobjekt Vorrang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!