Compartilhar via


Funções de conversão (C++)

Na conversão de construtores, descrito na seção anterior, objetos de um tipo podem ser convertidos implicitamente para um tipo de classe em particular.Esta seção descreve um meio pelo qual você pode fornecer conversões explícitas de um determinado tipo de classe para outro tipo.A conversão de um tipo de classe geralmente é realizada usando funções de conversão.Funções de conversão usam a seguinte sintaxe:

Gramática

  • nome da função de conversão:
    operador nome do tipo de conversão**()**

  • nome do tipo de conversão:
    lista de especificador de tipo operador de ptropt

O exemplo a seguir especifica uma função de conversão que converte o tipo de Money digitar double:

// spec1_conversion_functions1.cpp
struct Money {
   operator double() { return _amount; }

private:
    double _amount;
};

int main() {
   Money Account;
   double CashOnHand = Account;
}

A inicialização do CashOnHand com Account faz com que uma conversão de tipo Account digitar double.

Funções de conversão são chamadas de "operadores de conversão" porque são (juntamente com os construtores) funções chamadas quando a projeção é usada.O exemplo a seguir usa uma conversão explícita ou cast, para imprimir o valor atual de um objeto do tipo Money:

cout << (double)Account << endl;

Funções de conversão são herdadas em classes derivadas.Os operadores de conversão ocultar somente os operadores de conversão de classe base que converter para o mesmo tipo.Portanto, um user-defined operador int função não oculta um user-defined curto do operador função na classe base.

Apenas uma função de conversão definida pelo usuário é aplicada ao realizar conversões implícitas.Se não houver nenhuma função de conversão definidas explicitamente, o compilador não procura por tipos intermediários no qual um objeto pode ser convertido.

Se for necessária uma conversão que faz com que uma ambigüidade, será gerado um erro.Ambigüidades surgem quando mais de uma conversão definida pelo usuário está disponível ou quando existem uma conversão definida pelo usuário e uma conversão interna.

Exemplo

O exemplo a seguir ilustra uma declaração de classe com um potencial de ambigüidade:

// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>

struct String {
   // Define constructor that converts from type char *.
   String( char *szBuffer ) {
      strcpy_s( _text, szBuffer );
   }

   // Define conversion to type char *.
   operator char *() {
      return _text;
   }

   int operator==( const String &s )  {
      return !strcmp( _text, s._text );
   }

private:
   char _text[80];
};

int main() {
   String s( "abcd\0" );
   char *ch = "efgh";

   // Cause the compiler to select a conversion.
   return s == ch; // C2666
}

Na expressão s == ch, o compilador tem duas opções e nenhuma maneira de determinar qual está correto.Ele pode converter ch a um objeto do tipo String usando o construtor e, em seguida, executar a comparação usando definido pelo usuário operator==.Ou ele pode converter s para um ponteiro de tipo char * usando a conversão funcione e, em seguida, realiza uma comparação dos ponteiros.

Porque nenhuma escolha é "mais corretas" que o outro, o compilador não podem determinar o significado da expressão de comparação e gera um erro.

Consulte também

Referência

Conversões