c++ - try - ¿Qué es una función de "operador int"?
static_cast para que sirve (5)
El código en negrita es un operador de conversión. (AKA operador de reparto )
Le proporciona una forma de convertir su tipo INT
personalizado a otro tipo (en este caso, int
) sin tener que llamar explícitamente a una función de conversión especial.
Por ejemplo, con el operador de conversión, este código compilará:
INT i(1234);
int i_2 = i; // this will implicitly call INT::operator int()
Sin el operador de conversión, el código anterior no se compilará, y tendría que hacer otra cosa para pasar de una INT
a una int
, como por ejemplo:
INT i(1234);
int i_2 = i.a; // this wont compile because a is private
¿Cuál es la función "operador int" a continuación? ¿Qué hace?
class INT
{
int a;
public:
INT(int ix = 0)
{
a = ix;
}
/* Starting here: */
operator int()
{
return a;
}
/* End */
INT operator ++(int)
{
return a++;
}
};
Lo primero es lo primero:
$ 12.3.1 / 1 - "Un constructor declarado sin el especificador de la función explícita especifica una conversión de los tipos de sus parámetros al tipo de su clase. Dicho constructor se llama un 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 el siguiente código está bien formado:
INT i(1024); // direct initialization syntax
Esto significa que puede obtener un objeto INT de un entero. Sin embargo, ¿qué hace uno si el objeto INT tiene que volver a convertirse en un entero? Transitividad?
Se puede decir que la clase INT puede proporcionar una función miembro para devolver el miembro entero encapsulado
int x = i.geta();
Sin embargo, esto no es muy intuitivo y no es un enfoque estandarizado. Además, no es intuitivo cuando se trata de cómo funcionan los tipos integrados en tales situaciones.
int z = 0;
int y1 = z; // copy initialization or
int y2(z); // direct initialization
double d = (int )z; // explicit cast
Por lo tanto, el Estándar permite dicha estandarización e intuición para convertir los Tipos Definidos por el Usuario diciendo:
$ 12.3 / 2 - "Una función miembro de una clase X que no tiene parámetros con un nombre del formulario [...]
operador tipo-conversión-id
[...] especifica una conversión de X al tipo especificado por el ID de tipo de conversión. Tales funciones se llaman funciones de conversión. No se puede especificar ningún tipo de retorno. 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 admite ningún parámetro que devuelve el tipo de conversión id".
Esto hace que todo lo siguiente esté bien formado y se mantenga en armonía con la forma en que funcionan los tipos integrados.
int y1 = i; // copy initialization or
int y2(i); // direct initialization
double d = (int )i; // explicit cast
Parece que es una pregunta de un aula, así que te invito a que revises la documentación sobre cómo crear una clase.
class Foo
{
public
Foo() {} // Constructor
Foo operator++ {} // Operation ++ on foo like:
// Foo foo;
// foo++;
};
Parece que hace una clase INT que se comporta un poco como la int regular, solo que algunos otros operadores aún no están definidos.
¿Es este un problema de tarea?
operator int()
es un operador de conversión , que permite que esta clase se utilice en lugar de un int
. Si se utiliza un objeto de este tipo 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.