Konvertierungsfunktionen (C++)
Bei der Konvertierung von den im vorherigen Abschnitt beschriebenen Konstruktoren, können Objekte eines Typs implizit konvertiert werden zu einem bestimmten Klassentyp.In diesem Abschnitt werden Verfahren, mit der Sie explizite Konvertierungen von einem angegebenen Klassentyp in einen anderen Typ bereitstellen können.Konvertierung von einem Klassentyp ist häufig mithilfe der Konvertierungsfunktionen erreicht.Konvertierungsfunktionen verwenden die folgende Syntax:
Grammatik
NAME Konvertierung-FUNCTION:
Operator Konvertierung-TYPE **()**NAMENAME Konvertierung-TYPE:
TYPE-SpezifiziererListe PTROPERATORopt
Im folgenden Beispiel wird eine Konvertierungsfunktion an, dass Money-Typ konvertiert, um doubleeingeben:
// spec1_conversion_functions1.cpp
struct Money {
operator double() { return _amount; }
private:
double _amount;
};
int main() {
Money Account;
double CashOnHand = Account;
}
Die Initialisierung einer CashOnHand mit Account bewirkt, dass eine Konvertierung vom Typ Account , doubleeinzugeben.
Konvertierungsfunktionen werden häufig als „Umwandlungsoperatoren“ bezeichnet, da sie zusammen mit Konstruktoren) (die aufgerufenen Funktionen werden, wenn eine Umwandlung verwendet wird.Im folgenden Beispiel wird eine Umwandlung oder explizite Konvertierung, um den aktuellen Wert eines Objekts des Typs Moneyzu drucken:
cout << (double)Account << endl;
Konvertierungsfunktionen werden in abgeleiteten Klassen geerbt.Konvertierungsoperatoren blenden konvertierungsoperatoren nur Basisklassen aus, die genau dem gleichen Typ konvertieren.Daher blendet eine benutzerdefinierte Operator int keine benutzerdefinierte Funktion kurz Operator Funktion in einer Basisklasse aus.
Nur eine benutzerdefinierte Konvertierungsfunktion wird angewendet, wenn implizite Konvertierungen ausführt.Wenn keine explizit definierten Konvertierungsfunktion gibt, sucht der Compiler nach Grundlegende Typen nicht in die ein Objekt umgewandelt werden kann.
Wenn eine Konvertierung notwendig ist, um eine Mehrdeutigkeit bewirkt, dass ein Fehler generiert wird.Mehrdeutigkeiten auftreten, wenn mehr als eine benutzerdefinierte Konvertierung nicht verfügbar ist oder wenn eine benutzerdefinierte Konvertierung und eine integrierte Konvertierung vorhanden sind.
Beispiel
Im folgenden Beispiel wird eine Klassendeklaration mit einer möglichen Mehrdeutigkeit:
// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>
struct String {
// Define constructor that converts from type char *.
String( char *szBuffer ) {
strcpy_s( _text, szBuffer );
}
// Define conversion to type char *.
operator char *() {
return _text;
}
int operator==( const String &s ) {
return !strcmp( _text, s._text );
}
private:
char _text[80];
};
int main() {
String s( "abcd\0" );
char *ch = "efgh";
// Cause the compiler to select a conversion.
return s == ch; // C2666
}
Im Ausdruck s == ch, hat der Compiler zwei Auswahlmöglichkeiten und keine Methode zum Bestimmen, das fehlerfrei ist.Er kann ch in ein Objekt des Typs String mithilfe des Konstruktors konvertieren und den Vergleich mit benutzerdefinierten operator==anschließend ausführen.Oder er kann s auf einen Zeiger vom Typ char * mithilfe der Konvertierungsfunktion konvertieren und einen Vergleich der Zeiger anschließend ausführen.
Da außerdem nicht mehr richtig „Optionen“ als das andere ist, kann der Compiler die Bedeutung des Vergleichs mit nicht feststellen, und generiert einen Fehler.