Sdílet prostřednictvím


Změny u operátorů převodů

Syntaxe pro operátory převodů se změnily ze způsobu ze Správce rozšíření pro C++ na způsob z Visual C++ 2010.

Jedním z příkladu pro specifikaci převodu je zapsání op_Implicit. Zde je definice MyDouble, převzata z konkrétního jazyka:

__gc struct MyDouble {
   static MyDouble* op_Implicit( int i ); 
   static int op_Explicit( MyDouble* val );
   static String* op_Explicit( MyDouble* val ); 
};

Ta říká, že je dáno celé číslo, a algoritmus pro převádění tohoto celého čísla v MyDouble je poskytován operátorem op_Implicit. Kromě toho, že bude převod proveden implicitně kompilátorem. Podobně dává objekt MyDouble dva operátory op_Explicit, které poskytují příslušné algoritmy pro převod tohoto objektu buď na celé číslo nebo na spravovanou entitu String. Nicméně, kompilátor neprovede konverzi, pokud je explicitně požádována uživatelem.

V jazyce C# to vypadá takto:

class MyDouble {
   public static implicit operator MyDouble( int i ); 
   public static explicit operator int( MyDouble val );
   public static explicit operator string( MyDouble val ); 
};

Kód jazyka C# vypadá více jako jazyk C++ než spravované rozšíření jazyka C++. Toto není případ v nové syntaxi.

Standard jazyka ISO C++ představil klíčové slovo explicit, ke zmírnění nežádoucích důsledků – například třída Array, která přebírá jednotlivý celočíselný argument jako dimenzi, implicitně převede libovolné celé číslo na objekt Array, který neodpovídá tomu, co chcete. Jedním ze způsobů, jak tomu předejít, je návrh idiomu makety druhého argumentu do konstruktoru

Na druhé straně byste neměli poskytnout převod páru, když navrhujete typ třídy v rámci jazyka C++. Nejlepším příkladem je standardní třída řetězce. Implicitní převod je konstruktor s jediným argumentem, který přebírá řetězec ve stylu jazyka C. Avšak to neposkytuje odpovídající implicitní operátor převodu – převádění objektu řetězce na řetězec ve stylu jazyka C spíše vyžaduje, aby uživatel explicitně vyvolat pojmenovanou funkci – v tomto případě c_str().

Takže přidružení implicitního/explicitního chování na operátor převodu (a jako zapouzdření sady převodů do jednoduché formy deklarace) závisí na zlepšení podpory jazyka C++ pro operátory převodů, které případně vedly ke klíčovému slovu explicit. Visual C++ 2010 jazyková podpora pro operátory převodů vypadá takto, která je poněkud méně podrobná než u jazyka C#, protože výchozí chování operátoru podporující implicitní aplikaci převodního algoritmu:

ref struct MyDouble {
public:
   static operator MyDouble^ ( int i );
   static explicit operator int ( MyDouble^ val );
   static explicit operator String^ ( MyDouble^ val );
};

Další změna je, že jediný argument konstruktoru je zpracováván jako by byl deklarován jako explicit. To znamená, že za účelem aktivace jeho vyvolání, je vyžadováno explicitní spuštění. Upozorňujeme však, že pokud je definován explicitní operátor převodu, a není to jedno argumentový konstruktor, pak je vyvoláno.

Viz také

Koncepty

Členské deklarace v rámci třídy nebo rozhraní