Zmiany operatorów konwersji
Składnia operatory konwersji zmienił się z zarządzanych rozszerzeń języka C++ do Visual C++.
Jednym z przykładów jest napisanie op_Implicit do określenia konwersji.Poniżej przedstawiono definicję MyDouble pobranych z specyfikacji języka:
__gc struct MyDouble {
static MyDouble* op_Implicit( int i );
static int op_Explicit( MyDouble* val );
static String* op_Explicit( MyDouble* val );
};
To mówi, że biorąc pod uwagę całkowitą algorytm konwertowanie tej liczby całkowitej w MyDouble jest dostarczana przez op_Implicit operatora.Ponadto że konwersja zostanie przeprowadzona niejawnie przez kompilator.Podobnie, biorąc pod uwagę MyDouble object, dwóch op_Explicit operatorzy dostarczają odpowiednich algorytmów konwersji obiektu na całkowitą lub zarządzanych String encji.Jednak kompilator nie będzie wykonywał konwersji, chyba że wyraźnie zażądanej przez użytkownika.
W języku C# to wygląda następująco:
class MyDouble {
public static implicit operator MyDouble( int i );
public static explicit operator int( MyDouble val );
public static explicit operator string( MyDouble val );
};
Kod C# wygląda jak C++ niż zarządzane rozszerzenia języka C++.To nie jest w przypadku nowe elementy składni.
Komitet ISO C++ wprowadził słowo kluczowe, explicit, łagodzenie skutków niezamierzonych — na przykład, Array klasy, która ma jeden argument jako wymiar niejawnie konwertuje dowolnej liczby całkowitej w Array obiektu, którego nie chcesz.Jednym ze sposobów zapobiegania to jest języka projektowania fikcyjny drugi argument do konstruktora
Z drugiej strony należy nie podasz parę konwersji podczas projektowania typu klasy w języku C++.Najlepszym przykładem tego jest klasa string standardowych.Niejawna konwersja jest konstruktor pojedynczy argument biorąc ciąg stylu C.Jednak nie zapewnia odpowiedniego przedsiębiorcy niejawna konwersja – że konwersji ciągu obiekt na ciąg stylu C, ale raczej wymaga od użytkownika jawnie wywołać funkcję o nazwie — w tym przypadku c_str().
Tak, kojarzenie zachowanie niejawne/jawne na operatora konwersji (a jako zawierający zbiór konwersje do pojedynczego formularza deklaracji) pojawia się do poprawy na oryginalny obsługę języka C++ operatory konwersji, które ostatecznie doprowadziły do explicit słowa kluczowego.Visual C++ Obsługa języka operatory konwersji wygląda następująco, co jest verbose nieco mniej niż w języku C# ze względu na zachowanie domyślne operatora uzupełniających wniosek niejawna konwersja algorytmu:
ref struct MyDouble {
public:
static operator MyDouble^ ( int i );
static explicit operator int ( MyDouble^ val );
static explicit operator String^ ( MyDouble^ val );
};
Kolejna zmiana jest, że Konstruktor pojedynczy argument jest traktowany tak, jakby jest zadeklarowana jako explicit.Oznacza to, że aby wyzwolić jego wywołania, jawne rzutowania jest wymagane.Należy jednak pamiętać, że jeśli zdefiniowano operatora konwersji jawnej go i nie Konstruktor pojedynczy argument jest wywoływany.
Zobacz też
Koncepcje
Deklaracje członków w obrębie klasy lub interfejsu (C++/CLI)