elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sobrecarga de operador y constructores/destructores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sobrecarga de operador y constructores/destructores  (Leído 2,748 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Sobrecarga de operador y constructores/destructores
« 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.  


En línea

Dungeons & dragons;
dragons.Attack();
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #1 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


« Última modificación: 17 Junio 2019, 09:27 am por string Manolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #2 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)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #3 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.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #4 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.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #5 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.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #6 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..
En línea

Dungeons & dragons;
dragons.Attack();
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #7 en: 17 Junio 2019, 19:49 pm »

Mirate el link que te pasé que ahí te viene.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Sobrecarga de operador y constructores/destructores
« Respuesta #8 en: 18 Junio 2019, 15:35 pm »

Mirate el link que te pasé que ahí te viene.

Si, gracias, Lo veo.
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sobrecarga de operador<<
Programación C/C++
adam96 5 4,533 Último mensaje 17 Diciembre 2010, 19:10 pm
por Littlehorse
lio con constructores y destructores
Programación C/C++
Javincy 2 2,605 Último mensaje 8 Febrero 2012, 16:18 pm
por Javincy
Clases, Constructores y Destructores en C++
Programación C/C++
ThronerAXE 4 5,989 Último mensaje 11 Diciembre 2013, 02:34 am
por vangodp
Sobrecarga operador -> [C++]
Programación C/C++
K-YreX 2 1,744 Último mensaje 6 Enero 2019, 17:21 pm
por K-YreX
Sobrecarga de operador « 1 2 »
Programación C/C++
digimikeh 10 5,418 Último mensaje 18 Mayo 2019, 03:39 am
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines