Compartir a través de


Funciones de conversión (C++)

En la conversión de los constructores, descritos en la sección anterior, los objetos de un tipo se pueden convertir implícitamente en un tipo de clase determinado.Esta sección describe significa por qué puede proporcionar conversiones explícitas de un tipo de clase especificado a otro tipo.La conversión de un tipo de clase es a menudo logra mediante funciones de conversión.las funciones de conversión utilizan la sintaxis siguiente:

Gramática

  • conversión-función-nombre:
    conversión-tipo-nombre ()deoperador

  • conversión-tipo-nombre:
    PTR-operador de la tipo-especificador-listaopt

El ejemplo siguiente se especifica una función de conversión que convierte el tipo Money para escribir double:

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

private:
    double _amount;
};

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

La inicialización de CashOnHand con Account realiza una conversión de Account escrito para escribir double.

Las funciones de conversión se denominan a menudo “operadores de conversión” porque (junto con constructores) son funciones denominadas cuando se utiliza una conversión.El ejemplo siguiente utiliza la conversión, o la conversión explícita, imprimir el valor actual de un objeto de Moneytipo:

cout << (double)Account << endl;

las funciones de conversión se heredan en clases derivadas.Los operadores de conversión ocultan solo a los operadores de conversión de la clase base que convierten exactamente el mismo tipo.Por consiguiente, una función definida por el usuario de operador int no oculta una función definida por el usuario de short de operador en una clase base.

Se aplica sólo una función de conversión definida por el usuario para realizar conversiones implícitas.Si no hay ninguna función de conversión definidos explícitamente, el compilador no busca los tipos intermedios en los que un objeto puede convertir.

si se requiere una conversión que produce una ambigüedad, se genera un error.Las ambigüedades surgen cuando más de una conversión definida por el usuario está disponible o cuando no existe una conversión definida por el usuario y una conversión integrada.

Ejemplo

El ejemplo siguiente se muestra una declaración de clase con una ambigüedad posible:

// 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
}

En la expresión s == ch, el compilador tiene dos opciones y ninguna manera de determinar que es correcto.Puede convertir ch a un objeto de String escribe utilizando el constructor y después realizar la comparación mediante operator==definido por el usuario.O puede convertir s a un puntero de char * escribe utilizando la función de conversión y después realizar una comparación de los punteros.

Dado que ninguna de las dos opciones es más “correcto” que la otra, el compilador no puede determinar el significado de la expresión de comparación, y genera un error.

Vea también

Referencia

Conversiones