tutorial studio programacion móviles microcontrolador español desarrollo curso aplicaciones c++ constructor this

c++ - studio - Pasar "esto" a una función desde dentro de un constructor?



programacion android pdf 2018 (4)

Cuando crea una instancia de un objeto en C ++, el código en el constructor es lo último que se ejecuta. Todas las demás inicializaciones, incluida la inicialización de superclase, la ejecución del constructor de superclase y la asignación de memoria, suceden de antemano. El código en el constructor es realmente solo para realizar una inicialización adicional una vez que se construye el objeto. Por lo tanto, es perfectamente válido utilizar un puntero "this" en un constructor de clase y asumir que apunta a un objeto completamente construido.

Por supuesto, aún debe tener cuidado con las variables de miembro no inicializadas, si aún no las ha inicializado en su código de constructor.

¿Puedo pasar "esto" a una función como un puntero, desde dentro del constructor de la clase, y usarlo para apuntar a los miembros del objeto antes de que vuelva el constructor?

¿Es seguro hacer esto, siempre y cuando los miembros accedidos se inicialicen correctamente antes de la llamada a la función?

Como ejemplo:

#include <iostream> class Stuff { public: static void print_number(void *param) { std::cout << reinterpret_cast<Stuff*>(param)->number; } int number; Stuff(int number_) : number(number_) { print_number(this); } }; void main() { Stuff stuff(12345); }

Pensé que esto no funcionaría, pero parece que sí. ¿Este comportamiento estándar, o solo un comportamiento indefinido, sigue mi camino?


Andy, creo que estás equivocado sobre la parte indefinida del estándar.

Cuando estás en el constructor, "esto" es un puntero a un objeto cuyo tipo es la clase base del objeto que estás creando, lo que significa que se llamarán las funciones virtuales parcialmente implementadas en la clase base y los punteros en el la tabla virtual no será seguida.

Más información en C ++ Faq Lite ...


Como una nota al margen en el código presentado, en cambio, templa el void* :

class Stuff { public: template <typename T> static void print_number(const T& t) { std::cout << t.number; } int number; Stuff(int number_) : number(number_) { print_number(*this); } };

Entonces obtendría un error de compilación si el tipo de t no tiene un miembro de number .


Aquí puede encontrar una buena respuesta (Preguntas frecuentes sobre C ++).

Se garantiza que todos los miembros heredados y miembros de la clase llamante se han construido al comienzo de la ejecución del código del constructor y, por lo tanto, se puede hacer referencia a ellos de forma segura.

El problema principal es que no deberías invocar funciones virtuales en this . La mayoría de las veces que lo he probado termina llamando a la función de la clase base, pero creo que el estándar dice que el resultado no está definido.