Compartilhar via


Alterações operadores de conversão

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

Um exemplo é gravar op_Implicit para especificar uma conversão.Aqui está uma definição de MyDouble extraído da 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, dado um número inteiro, o algoritmo para converter esse inteiro em um MyDouble fornecida pelo op_Implicit operador.Além disso, a conversão será executada implicitamente pelo compilador.Da mesma forma, dado um MyDouble objeto, os dois op_Explicit operadores fornecem os respectivos algoritmos para converter o 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 C#, isso parece como segue:

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

Código C# parece mais C++ que o Managed Extensions for C++.Que não é o caso da nova sintaxe.

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

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

Assim, associar um comportamento explícito implícito de um operador de conversão (e como 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 a explicit palavra-chave.O Visual C++ suporte ao idioma para os operadores de conversão da seguinte maneira, parece que é um pouco menos detalhada do que C# por causa do comportamento padrão do operador de suporte a um aplicativo implícito do algoritmo de conversão:

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

Outra alteração é que um construtor de argumento único é tratado como se ele é declarado como explicit.Isso significa que, para acionar suas invocações, uma conversão explícita é necessária.No entanto, observe que, se um operador de conversão explícita é definido, ele e não o construtor de argumento único, é invocado.

Consulte também

Conceitos

Declarações de membro em uma classe ou uma interface (C++/CLI)