🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1661

Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????

#1661
From: Karsten Baensch
Date: Thu, 15 Feb 1996 13:42
63 lines
2938 bytes
andi@linux8.phonetik.uni-muenchen.de (Andreas Zierdt) writes:

>Dirk Brenckmann (brenck@iib.bauwesen.th-darmstadt.de) wrote:

>: Im Ernst. Speziell beim Ueberladen von + und - operatoren in Klassen
>: ergibt sich das Problem, dass ich innerhalb der Methoden neue Instanzen
>: schaffen muss, um die per return wieder zuruck zu geben.

>Das folgende Beispiel sollte zeigen, wie es geht:

>/* Der Operator = ermöglicht Zuweisungen von Vektoren.*/

>template<class T> Vector<T>& Vector<T>::operator=(const Vector& v)
>{
>        unsigned int    i;
>        
>        if (this == &v)
>           return( *this);        

>        for (i=0; i<dim; i++)
>           data[i] = v.data[i];

>          return (*this);
>}

>/* Die Operatoren + und - erlauben Vektoraddition und -subtraktion. */          

>template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const
>{
>         unsigned int    i;
>         Vector result(dim);
>          
>          for (i=0; i<dim; i++)
>                  result.data[i] = data[i] + v.data[i];
>                  
>          return(result);
>}          

>Berechnet man jetzt a = b + c, so umfaßt die Lebensdauer des neuen, von
>+() erzeugten Objekts, die Zeit, während der der operator=() aktiv ist.

Wenn er zusaetzlich noch einen korrekten Copykonstruktor fuer Vector<T> 
definiert, dann funktionierts. Denn das innerhalb von 
'template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const'
mit Vector 'result(dim);' erzeugte automatische Objekt ist zur Zeit der
Ausfuehrung von 'operator=()' nicht mehr am Leben! Wenn obige Aussage so
gemeint war, dann ist sie meiner Meinung nach falsch. Korrigiert mich,
wenn ich mich irre.
Wenn es so waere, dann koennte 'operator+' auch eine Referenz auf 'result'
zurueckliefern, um diese dann an 'operator=(const Vector& v)' zu
uebergeben. Das wuerde vieles einfacher machen. Geht aber nicht.

Erst durch 'return(result);' wird im Kontext der
aufrufenden Funktion ein temoraeres Objekt erzeugt und mit 'result'
initialisiert. Fuer eben diese Initialisierung braucht man den
Copykonstruktor.

Karsten
--
(  Email: Karsten.Baensch@hrz.tu-chemnitz.de                                ( 
 ) WWW:   http://www.tu-chemnitz.de/~kba/baensch.html                        )
(  Phone: (+49-) 0371/531-1252                                              ( 
 ) Mail:  Technical University, Computing Services, 09107 Chemnitz, Germany  )
Technical Details
Message-ID: <4fve0v$fe8@pyrrhus-f.hrz.tu-chemnitz.de>
Path: arc1-ca.pugleaf.net!news.tu-chemnitz.de!news
References: <4fspll$j05@rs18.hrz.th-darmstadt.de> <4ft4ri$ne@sparcserver.lrz-muenchen.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.tu-chemnitz.de!news
From: kba@hrz.tu-chemnitz.de (Karsten Baensch)
Newsgroups: de.comp.lang.c++
Subject: Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
Date: 15 Feb 96 13:42:42 GMT
Organization: University of Technology Chemnitz, FRG
Message-ID: <4fve0v$fe8@pyrrhus-f.hrz.tu-chemnitz.de>
References: <4fspll$j05@rs18.hrz.th-darmstadt.de> <4ft4ri$ne@sparcserver.lrz-muenchen.de>
NNTP-Posting-Host: shark.hrz.tu-chemnitz.de