2010-09-28 15 views
23

¿Qué es la función "operator int" a continuación? ¿Qué hace?¿Qué es una función "operador int"?

class INT 
{ 
    int a; 

public: 
    INT(int ix = 0) 
    { 
     a = ix; 
    } 

    /* Starting here: */ 
    operator int() 
    { 
     return a; 
    } 
    /* End */ 

    INT operator ++(int) 
    { 
     return a++; 
    } 
}; 
+0

¿Qué código en negrita? De lo contrario, es básicamente un contenedor para 'int' con conversión a' int' y operador '++'. –

+3

Al mirar la fuente de la publicación original, 'operator int()' se supone que es el código en negrita. –

+6

Si pudiera, honestamente votaría para volver a abrir esto. La pregunta original tenía un formato pobre, pero tenía un segmento de código claramente en negrita. Una edición posterior (no realizada por el OP) fue lo que hizo que el código no fuera audaz y, por lo tanto, hizo que la pregunta pareciera incoherente. – eldarerathis

Respuesta

24

El código en negrita es un operador de conversión. (También conocido como cast operator)

Te da una manera de convertir de su tipo personalizado INT a otro tipo (en este caso, int) sin tener que llamar a una función especial de conversión de forma explícita.

Por ejemplo, con el operador de conversión, este código se compilará:

INT i(1234); 
int i_2 = i; // this will implicitly call INT::operator int() 

sin que el operador de conversión, el código anterior no compilará, y que tendría que hacer algo más que ir de un INT a un int, tales como:

INT i(1234); 
int i_2 = i.a; // this wont compile because a is private 
4

Parece que tiene una clase INT que se comporta un poco como la int normal, solo que algunos otros operadores aún no están definidos.

¿Es esto un problema de tarea?

3

Parece que es una pregunta de un aula, así que lo invitaré a consultar la documentación sobre cómo crear una clase.

class Foo 
{ 
public 
    Foo() {} // Constructor 

    Foo operator++ {} // Operation ++ on foo like: 
    // Foo foo; 
    // foo++; 
}; 
15

operator int() es un operador conversión, lo que permite esta clase para ser usado en lugar de un int. Si un objeto de este tipo se usa en un lugar donde se espera un int (u otro tipo numérico), este código se usará para obtener un valor del tipo correcto.

Por ejemplo:

int i(1); 
INT I(2); // Initialised with constructor; I.a == 2 
i = I; // I is converted to an int using `operator int()`, returning 2. 
4

Lo primero es lo primero:

$ 12.3.1/1 - "Un constructor declara sin la función especificador explícita especifica una conversión de los tipos de sus parámetros al tipo de su clase. Tal constructor se llama constructor de conversión. "

En su ejemplo, INT es una clase definida por el usuario que tiene un constructor de conversión de 'int'.

Por lo tanto está bien formado el siguiente código:

INT i(1024);  // direct initialization syntax 

Esto significa que se puede obtener un objeto INT de un número entero. Sin embargo, ¿qué hace uno si el objeto INT se debe volver a convertir en un número entero? Transitividad?

Se puede decir que el INT clase puede proporcionar una función miembro para devolver el miembro de número entero encapsulado

int x = i.geta(); 

Sin embargo, esto no es muy intuitivo y no es un método estándar.Tampoco es intuitivo cuando se trata de cómo funcionan los tipos incorporados en tales situaciones.

int z = 0; 
int y1 = z; // copy initialization or 
int y2(z); // direct initialization 
double d = (int)z; // explicit cast 

para ello la norma permite dicha normalización e intuición de conversión de tipos definidos por el usuario diciendo:

$ 12,3/2 - "Una función miembro de una X clase no tener parámetros con un nombre de la forma [...]

operador de conversión de tipo-id

[ ...] especifica una conversión de X al tipo especificado en id-conversión-tipo. Tales funciones son llamadas funciones de conversión. No se puede especificar el tipo de devolución . Si una función de conversión es una función miembro, el tipo de la función de conversión (8.3.5) es "función que no toma el parámetro de conversión-id".

Esto hace que todos los siguientes bien formados y conserva armonía con la forma integrada de los tipos de trabajo es

int y1 = i; // copy initialization or 
int y2(i); // direct initialization 
double d = (int)i; // explicit cast