Alterações feitas em operadores da conversão
A sintaxe para operadores de conversão foi alterada de extensões gerenciadas para C++ a Visual C++.
Um exemplo é gravar op_Implicit para especificar uma conversão. Eis uma definição de MyDouble tomada 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 indica que, dado um inteiro, o algoritmo para converter esse valor inteiro em MyDouble é fornecido pelo operador de op_Implicit . Além disso, essa conversão será executada implicitamente pelo compilador. De maneira semelhante, dado um objeto de MyDouble , os dois operadores de op_Explicit fornecem os algoritmos respectivos para converter esse objeto em um inteiro ou em uma entidade gerenciada de String . No entanto, o compilador não executará a conversão a menos que sejam explicitamente solicitados pelo usuário.
No C#, isso é semelhante a 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 de exemplo c como C++ mais do que as extensões gerenciadas para C++ oferecem. Isso não é os casos na nova sintaxe.
O comitê de ISO-C++ o introduziu uma palavra-chave, explicit, para reduzir consequências não intencionais – por exemplo, uma classe de Array que usa um único argumento inteiro como uma dimensão converterá implicitamente qualquer inteiro em um objeto de Array que não é o que você deseja. Uma maneira de evitar isso é uma linguagem de design de um segundo argumento fictícia a um construtor
Por outro lado, você não deve fornecer um par de conversão ao criar um tipo de classe do C++. O melhor exemplo para que é a classe padrão de cadeia de caracteres. A conversão implícita é o construtor de um único argumento que usa a c o estilo da cadeia de caracteres. Porém, o não fornece um operador de conversão implícita de correspondência – da conversão de um objeto de cadeia de caracteres para c o estilo da cadeia de caracteres, mas requer um pouco o usuário invocar explicitamente uma função nomeada – nesse caso, c_str().
Assim, associar comportamento implícita e explícita em um operador de conversão (e como encapsular o conjunto de conversões a um único formulário de declaração) parece ser uma melhoria no suporte ao original C++ para os operadores de conversão, que resultaram se houver a explicit a palavra-chave. O suporte a idioma de Visual C++ para operadores de conversão é semelhante a seguir, que é um pouco menos detalhado que o C# devido ao comportamento padrão do operador que oferece 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 único construtor de argumento será tratado como se for declarado como explicit. Isso significa que para disparar as invocações, uma conversão explícita é necessária. Observe, entretanto, que se um operador de conversão explícita é definido, ele e não o construtor de um único argumento, é invocada.
Consulte também
Conceitos
Declarações de membro em uma classe ou uma interface (C++/CLI)