2010-06-09 16 views
8

Recientemente, estaba navegando por mi copia de C++ Pocket Reference de O'Reilly Media, y me sorprendió cuando encontré una breve sección y un ejemplo sobre la conversión definida por el usuario. tipos definidos:Conversiones definidas por el usuario en C++

#include <iostream> 

class account { 

    private: 
     double balance; 

    public: 
     account (double b) { balance = b; } 

     operator double (void) { return balance; } 
}; 

int main (void) { 

    account acc(100.0); 
    double balance = acc; 

    std::cout << balance << std::endl; 

    return 0; 
} 

he estado programando en C++ para un rato, y esta es la primera vez que he visto este tipo de sobrecarga de operadores. La descripción del libro de este tema es breve, dejándome con algunas preguntas sin respuesta sobre esta característica:

  • ¿Es esta una característica particularmente oscura? Como dije, he estado programando en C++ por un tiempo y esta es la primera vez que me encuentro con esto. No he tenido mucha suerte para encontrar más material en profundidad sobre esto.
  • ¿Es esto relativamente portátil? (Estoy compilando en GCC 4.1)
  • ¿Se pueden realizar las conversiones definidas por el usuario a los tipos definidos por el usuario? p.ej.

    operador std :: string() {/ * código * /}

+0

Lo siento, pero una conversión implícita de 'account' a' double' es simplemente estúpida. – fredoverflow

+0

¿Qué tiene eso que ver con la pregunta? –

Respuesta

12

¿Es esta una característica particularmente oscura?

Sí, los operadores de conversión no se utilizan con mucha frecuencia. Los lugares que he visto son para tipos definidos por el usuario que pueden degradarse a los integrados. Cosas como una clase numérica de precisión fija que admite la conversión a/desde tipos de números atómicos.

¿Es esto relativamente portátil?

Por lo que sé, lo es. Han estado en el estándar para siempre.

¿Se pueden realizar las conversiones definidas por el usuario a los tipos definidos por el usuario?

Sí, esa es una de las características de los constructores. Un constructor que toma un solo argumento de manera efectiva crea un operador de conversión del tipo de argumento al tipo de su clase.Por ejemplo, una clase como esta:

class Foo { 
public: 
    Foo(int n) { 
     // do stuff... 
    } 
} 

de dejar que hagas:

Foo f = 123; 

Si ha utilizado std::string antes, es probable que hayas usado esta función sin darse cuenta. (Dicho sea de paso, si quieres evitar este comportamiento, declarar cualquier constructores de un solo argumento usando explicit.)

4

No es particularmente oscuro; es muy portátil (después de todo, es parte del lenguaje) y es posible la conversión a tipos definidos por el usuario.

Una palabra de advertencia, tener muchas posibles rutas de conversión implícitas puede provocar la conversión inesperada y errores sorprendentes. Además, tener constructores de conversión no explícitos y funciones de conversión entre varios tipos definidos por el usuario puede llevar a secuencias de conversión más ambiguas que pueden ser difíciles de resolver.

3

Esta es una característica estándar de C++ particularmente útil y no es un poco oscura :) Puede usar tipos fundamentales y definidos por el usuario para operadores de conversión.

4

Se trataba de una de las primeras cosas que yo me encontré cuando era aprender C++, así que me gustaría di que no, no es tan oscuro.

Sin embargo, una cosa que advierto: Use la palabra clave explicit con ellos a menos que sepa exactamente lo que está haciendo. Las conversiones implícitas pueden hacer que el código se comporte de formas inesperadas, por lo que debe evitar usarlas en la mayoría de los casos. Francamente, sería más feliz si el idioma no los tuviera.

+0

+1 - las conversiones implícitas pueden dañar – Bill

+2

Tenga en cuenta que, por el momento, solo puede marcar los constructores de conversión como explícitos. Los operadores de conversión siempre están implícitos, aunque eso está cambiando en C++ 0x. –

Cuestiones relacionadas