Funkce převodu (C++)
V převodu konstruktory, popsané v předchozí části objektů typu lze implicitně převést na typ konkrétní třídy.Tato část popisuje způsob, kterým lze poskytnout explicitní převody z dané třídy typu na jiný typ.Konverze z typu třídy často lze provést pomocí funkcí pro převod.Funkce převodu, použijte následující syntaxi:
Gramatika
název funkce převodu:
operátor název typu převodu**()**Název typu převodu:
seznam typ specifikátoru ptr operátoropt
Následující příklad určuje funkci pro převod převede typ Money k zadání double:
// spec1_conversion_functions1.cpp
struct Money {
operator double() { return _amount; }
private:
double _amount;
};
int main() {
Money Account;
double CashOnHand = Account;
}
Inicializace CashOnHand s Account způsobí, že převod z typu Account k zadání double.
Funkce převodu jsou často nazývány "cast operátory", protože (spolu s konstruktory) jsou funkcí volat, pokud je použit osazení.Následující příklad používá k tisku aktuální hodnoty objektu typu cast nebo explicitní převod, Money:
cout << (double)Account << endl;
Funkce převodu se dědí v odvozené třídy.Operátory převodu skrýt pouze operátory převodu třídy base, které převést do stejného typu.Proto uživatelem definované int operátor funkce neskryje uživatelem definované operátor krátké funkce v základní třídě.
Pouze jednu funkci uživatelem definovaný převod je použita při provádění implicitní převody.Pokud není žádná konverze explicitně definované funkce, kompilátor hledat dílčí typy, do kterých lze objekt převést.
Pokud je požadován převod způsobující, že nejednoznačnosti, je generována chyba.Nejasnosti vznikají, je k dispozici více než jeden uživatelem definovaný převod nebo uživatelem definovaný převod a předdefinovaného převodu existují.
Příklad
Následující příklad ukazuje deklaraci třídy s potenciální dvojznačnosti:
// 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
}
Ve výrazu s == ch, kompilátor má dvě možnosti a způsob určení, které je správné.Můžete převést ch na objekt typu String pomocí konstruktoru a provést porovnání pomocí uživatelem definovaných operator==.Nebo můžete převést s na ukazatel typu char * převod pomocí funkce a potom provést porovnání ukazatelů.
Protože žádná volba "více Opravit" než ostatní kompilátor nemůže zjistit význam výrazu porovnání a generuje chybu.