Funkcje konwersji (C++)
Podczas konwersji przez konstruktorów opisane w poprzedniej sekcji obiektów z jednego typu można niejawnie konwertować typu danej klasy.W tej sekcji opisano sposób, przez które można dostarczyć Konwersje jawne od rodzaju danej klasy innego typu.Konwersja z typu klasy jest często realizowane przy użyciu funkcji konwersji.Funkcje konwersji należy użyć następującej składni:
Gramatyka
Nazwa funkcji konwersji:
operator Nazwa typu konwersji**()**Nazwa typu konwersji:
listy specyfikatora typu ptr-operatoropt
W poniższym przykładzie funkcja konwersji, który konwertuje typu Money do typu double:
// spec1_conversion_functions1.cpp
struct Money {
operator double() { return _amount; }
private:
double _amount;
};
int main() {
Money Account;
double CashOnHand = Account;
}
Inicjowanie CashOnHand z Account powoduje, że konwersja z typu Account do typu double.
Funkcje konwersji są często nazywane "Operatorzy cast", ponieważ są one (wraz z konstruktorów) funkcje wywoływane, gdy jest używane rzutowanie.W poniższym przykładzie użyto lanego lub jawne konwersji, aby wydrukować bieżącą wartość obiektu typu Money:
cout << (double)Account << endl;
Funkcje konwersji są dziedziczone w klas pochodnych.Operatory konwersji ukryć tylko operatory konwersji klasa bazowa przekonwertować do tego samego typu.W związku z tym, zdefiniowanych przez użytkownika operator int funkcji nie powoduje ukrycia przez użytkownika operator krótki funkcji w klasie podstawowej.
Tylko jedna funkcja zdefiniowana przez użytkownika konwersja jest stosowane podczas wykonywania konwersje niejawne.Jeśli żadna funkcja konwersji jawnie zdefiniowane, kompilator nie szukał typów pośrednie, do których można konwertować obiekt.
Jeśli konwersja jest wymagana, która powoduje niejednoznaczność, zostanie wygenerowany błąd.Niejasności powstają, gdy dostępnych jest więcej niż jeden zdefiniowana przez użytkownika konwersja lub gdy istnieje zdefiniowana przez użytkownika konwersja i konwersji wbudowanej.
Przykład
Poniższy przykład ilustruje deklarację klasy z potencjalnej niejednoznaczności:
// 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
}
W wyrażeniu s == ch, kompilator ma dwie możliwości i nie ma możliwości określenia, która jest poprawna.Można go przekonwertować ch do obiektu typu String za pomocą konstruktora, a następnie przeprowadzić porównania, przy użyciu przez użytkownika operator==.Lub można go przekonwertować s do wskaźnika typu char * za pomocą konwersji działać, a następnie przeprowadzić porównanie wskaźników.
Ponieważ żaden wybór jest "bardziej poprawne" niż inne, kompilator nie może ustalić znaczenie wyrażenie porównania i generuje błąd.