Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 17 Junio 2019, 04:54 am



Título: Sobrecarga de operador y constructores/destructores
Publicado por: digimikeh en 17 Junio 2019, 04:54 am
Hola..

haciendo algunos ensayos, me he encontrado con una sorpresa, cuando intento utilizar algún operador sobrecargado con un tipo propio, se ejecuta el constructor y el destructor al instante.... ej:

Código
  1.  
  2. struct x{
  3.  
  4. private:
  5.     int a;
  6.  
  7. public:
  8.     x(){ std::cout << "Constructor ejecutado."; }
  9.     ~x() { std::cout << "Deconstructor ejecutado."; }
  10.     inline void setA(const int _a){ this->a = _a; }
  11.     inline int getA() const { return this->a; }
  12. }
  13.  
  14. std::ostream operator <<(std::ostream & _os, const x _x){
  15.     _os << _x.getA();
  16.     return _os;
  17. }
  18.  
  19.  
  20.  
  21. int main(){
  22.  
  23.     x typeX;    //Constructor llamado como es usual..
  24.     std::cout << x;     //Constructor y deconstructor llamados, por que?
  25.  
  26. }
  27.  
  28.  
  29.  


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: @XSStringManolo en 17 Junio 2019, 09:13 am
El destructor se llaman cuando se destruye un objeto.
Al usar el return, el objeto(variable de la clase) _os se va fuera de scope(alcance) asique se llama al destructor automáticamente tras el return.
Pd: Disculpa, es el puntero this lo que se retorna con el objeto y se sale de scope.

Te he subido un pastebin con la traducción que hice del capitulo 8 del libro Apress learn cpp for game development que va de POO en la aue se explica y más cosas.
https://pastebin.com/jcg3yzEn


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: Eternal Idol en 17 Junio 2019, 09:38 am
No compila con facilidad ese codigo pero bueno, la clave es que se crea un objeto temporal del tipo x (no ostream, el que tiene el cout en el constructor y destructor no es ostream precisamente) por una razon: estas pasando x por valor. Pasalo como referencia y no se creara mas:

Código
  1. std::ostream &operator <<(std::ostream & _os, const x & _x)


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: RayR en 17 Junio 2019, 16:45 pm
Ese ejemplo tuyo y lo que te comenta Eternal Idol es la razón por la que se suele recomiendar pasar los objetos por referencia, ya que así se evita la creación de copias temporales.

Sin embargo, en tu código, la línea 24 no invoca al constructor que tú escribiste, ya que se trata del constructor por defecto (sin parámetros). Ese sólo se llama cuando creas un objeto como en la línea 23. En la línea 24, como te indicaron, se está copiando un objeto, por lo que se invoca al constructor de copia de x. Tú no escribiste uno, por lo que el compilador lo hace por ti y es ése el que es llamado. Por eso, al ejecutar tu programa, deberías ver sólo un mensaje de " constructor ejecutado" y dos del destructor.


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: CalgaryCorpus en 17 Junio 2019, 17:43 pm
En este programa x en minuscula es el tipo, no es el nombre de una variable, de modo que tiene que haber 2 constructores pues hay 2 objetos distintos creados aqui.


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: Eternal Idol en 17 Junio 2019, 17:57 pm
En este programa x en minuscula es el tipo, no es el nombre de una variable, de modo que tiene que haber 2 constructores pues hay 2 objetos distintos creados aqui.


Tal cual esta el fragmento (y sin tener en cuenta el faltante de cabeceras) no compila (la estructura no termina con un };, la sobrecarga si es interna necesita de friend, el valor de retorno de la sobrecarga debe ser una referencia y finalmente x es una estructura y lo que quiere empujar en cout es la variable que acaba de definir) pero segun la descripcion no es el caso, simplemente un typo.


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: digimikeh en 17 Junio 2019, 19:42 pm
Vaya si, me he equivocado al replantear el ejemplo, debi reemplazar x por typeX al final en el cout...


Bueno, comentar que he pasado el argumento por referencia y ahí no me ejecutó el constructor....  lo cual ahora que lo veo bien si es lógico..

de repente es algo confuso saber cuando retornar una referencia o una copia y cuando aceptar un argumento como referencia o como copia en los operadores sobrecargados...

gracias por la ayuda..


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: @XSStringManolo en 17 Junio 2019, 19:49 pm
Mirate el link que te pasé que ahí te viene.


Título: Re: Sobrecarga de operador y constructores/destructores
Publicado por: digimikeh en 18 Junio 2019, 15:35 pm
Mirate el link que te pasé que ahí te viene.

Si, gracias, Lo veo.