Alterações em operadores de conversão

A sintaxe para os operadores de conversão foi alterado de gerenciado Extensions para C++ para Visual C++ 2008.

Um exemplo é escrever op_Implicit Para especificar uma conversão. Eis uma definição de MyDouble extraído de especificação de linguagem:

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

Isso significa que, devido a um número inteiro, o algoritmo para converter esse inteiro em um MyDouble é fornecida pela op_Implicit operador. Além disso, essa conversão será realizada implicitamente pelo compilador.Da mesma forma, dado um MyDouble objeto, os dois op_Explicit operadores fornecem os respectivos algoritmos para converter esse objeto em um número inteiro ou um gerenciado String entidade. No entanto, o compilador não executará a conversão, a menos que explicitamente solicitado pelo usuário.

No translation from VPE for Csharp, isso parece da seguinte maneira:

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

O código translation from VPE for Csharp se parece mais com C++ que gerenciado Extensions para C++ faz.Não é o caso na nova sintaxe.

O comitê de ISO-C++ introduziu uma palavra-chave, explicit, para atenuar conseqüências indesejadas – por exemplo, um Array classe que usa um único argumento inteiro sistema autônomo uma dimensão implicitamente converterá qualquer número inteiro em um Array objeto que é não o que você deseja. Uma maneira de evitar que isso é um idioma de design de um segundo argumento fictício para um construtor

Por Outros lado, você não deve fornecer um emparelhar de conversão durante a criação de um tipo de classe do C++.O melhor exemplo para que é a classe de seqüência de caracteres padrão.Conversão implícita é o construtor de argumento único tirando uma seqüência de caracteres de estilo C.No entanto, ele não fornece o correspondente conversão implícita operador – que de converter um objeto de cadeia de caracteres em um estilo C em seqüência, mas em vez disso, exige que o usuário chamar explicitamente uma função nomeada – nesse caso, c_str().

Dessa forma, associar um comportamento implícita/explícito de um operador de conversão (e sistema autônomo o conjunto de conversões para um único formulário de declaração de encapsulamento) parece ser um aperfeiçoamento no suporte de C++ original para operadores de conversão que eventualmente levaram à explicit palavra-chave. The Visual C++ 2008 o suporte ao linguagem para sistema autônomo operadores de conversão é sistema autônomo a seguir, que é um pouco menos detalhada do que translation from VPE for Csharp por causa do comportamento padrão do operador com suporte para um aplicativo do algoritmo de conversão implícito:

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

Outra alterar é que um único argumento de construtor é tratado sistema autônomo se ela é declarada sistema autônomo explicit. Isso significa que, para acionar seus invocações, uma conversão explícita é necessária.No entanto, observe que, se um operador de conversão explícita for definido, ele e não o construtor de argumento único, é invocado.

Consulte também

Conceitos

Declarações de membro dentro de uma classe ou interface