Newsgroup: it.comp.lang.c++
Titolo: [lunghino] Distruttore? ma dove...

non capisco perchč quando utilizzo un operatore definito da me in una classe
su due o + oggetti( ad e sempio += ), mi richiama il distruttore.
esempio
#include<stdio.h>
#include"complex.h"
const int NULL=0;
void main(){
 complex Cplx;
 complex special;
 special.Setvalue(4,2);
 Cplx.Setvalue(2,1);
 special.show();
 Cplx.show();
 Cplx+=special; // in questo punto mi chiama il distruttore
 Cplx.show();
}
-------------------------------------------------------------------
class complex{
  public:
   complex();
   complex(int,int);
   complex& operator+=(complex);
   complex sum(complex);
   complex sub(complex);
   void Setvalue(int,int);
   void show();
   ~complex();
  private:
   int Re; int Im;
  };
----------------------------------------------------------------------------
-
#include<stdio.h>
#include "complex.h"
const int NULL=0;
complex::complex():Re(1),Im(1){
 }
complex::complex(int x,int y){
 Re=x;
 Im=y;
 }
complex complex::sum(complex a){
 complex Result;
 Result.Re=a.Re+(this->Re);
 Result.Im=a.Im+(this->Im);
 return Result;
}
complex complex::sub(complex a){
 complex Result;
 Result.Re=a.Re-(this->Re);
 Result.Im=a.Im-(this->Im);
 return Result;
}
complex& complex::operator+= (complex a){
 Re+=a.Re;
 Im+=a.Im;
 return *this;
}
void complex::Setvalue(int a,int b)
{
 Re=a;Im=b;
}
complex::~complex(){ printf("Ti distruggo\n");}
void complex::show(){
 printf("\n %d+j%d \n",this->Re,this->Im);
}
----------------------------------------------------------------------------
--------
--
- - -
- "Molti tra i vivi meritano la morte. E parecchi che sono morti avrebbero
meritato la vita. Sei forse tu in grado di dargliela? E allora non essere
troppo generoso nel distribuire la morte nei tuoi giudizi: sappi che nemmeno
i piů saggi possono vedere tutte le conseguenze."
Gandalf il grigio.


Definendo l'operatore += hai usato come parametro formale: (complex a)
Cio' significa che nel momento in cui usi questo operatore, l'oggetto
special viene copiato su a ( ed a proposito, non hai definito il costruttore
di copia per cui verra' chiamato quello di default).
Per cui viene creato l' oggetto temporaneo a di tipo complex su cui viene
copiato l'oggetto special che gli passi tu nella tua chiamata nel main,
utilizzando l'operatore += da te definito.
All'uscita della funzione operator +=, questo oggetto temporaneo viene
quindi distrutto.
Penso sia meglio se dichiari i tuoi parametri formali (complex &par) invece
che (complex par), cosi' eviti il costruttore di copia passando il
riferimento.
Maurus

 su due o + oggetti( ad e sempio += ), mi richiama il distruttore.
Se gli oggetti li passi per valore, vengono creati delle copie
temporanee che vengono poi distrutte.  Lo stesso accade se nei metodi
crei tu un temporaneo, e poi lo ritorni per valore.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 di copia per cui verra' chiamato quello di default).
Probabilmente ti sei espresso male,in realta' viene invocato il costruttore
di copia predefinito.

 wrote in message
news:as94ef$q4v$1...@newsreader.mailgate.org...

Non ho capito cosa non hai capito: dire che verra' chiamato il costruttore
di copia di default o dire che verra' chiamato quello predefinito non
significa dire la stessa cosa?
Probabilmente e' meglio dire predefinito essendo un termine italiano, ma per
me default vuol dire la stessa cosa.
Maurus

 >
potrebbe lasciar intendere che se non definisci un costruttore di copia, in
caso di passagio di oggetti per valore, viene invocato il costruttore di
default.
Ciao Ivan


Ok, ora ho capito che non ero stato chiaro.
In effetti intendevo il costruttore di copia di default.
Grazie
Maurus

 ma per me default vuol dire la stessa cosa.
tu hai scritto: "non hai definito il costruttore di copia per cui verra' 
chiamato quello di default"; da questa frase sembra che venga invocato 
il costruttore di default, che e` ben diverso dal costruttore per copia 
predefinito.
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra