Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

c++: frage zum überladen von operatoren

Yves3 / 9 Antworten / Baumansicht Nickles

hallo


ich habe eine frage zu diesem quellcode.


wozu wird der zeiger "this" zurück gegeben? ich testete das programm ohne rückgabe dieses zeigers und es funktionierte auch. dann wies ich zum test das objekt "wiskers" sich selbst zu. darauf wurde für sein alter irgend eine ziemlich hohe negative zahl ausgegeben. warum das?


es geht ja eigentlich darum, den speicher nicht zu löschen, wenn das objekt fälschlicherweise sich selbst zugewiesen wird. wozu braucht es da einen rückgabewert?


und wozu wird bei normalem ablauf der dereferenzierte zeiger "this" zurück gegeben? "itsAge" und "itsWeight" sind ja zeiger auf den heap. da muss man doch eigentlich auch nichts mehr zurück geben, oder?


kann mir das jemand erklähren?  hab ich etwas grundlegendes falsch verstanden?


danke für die hilfe!!


#include <iostream.h>


class CAT
{
public:
 CAT();
 int GetAge() const { return *itsAge; }
 int GetWeight() const { return *itsWeight; }
 void SetAge(int age) { *itsAge = age; }
 CAT& operator=(const CAT &);


private:
 int *itsAge;
 int *itsWeight;
};


CAT::CAT()
{
 itsAge = new int;
 itsWeight = new int;
 *itsAge = 5;
 *itsWeight = 9;
}



CAT& CAT::operator =(const CAT & rhs)
{
 if(this == &rhs)
  return * this;
 delete itsAge;
 delete itsWeight;
 itsAge = new int;
 itsWeight = new int;
 *itsAge = rhs.GetAge();
 *itsWeight = rhs.GetWeight();
 return *this;
}



int main()
{


 CAT frisky;
 cout << "Alter von Frisky: " << frisky.GetAge() << endl;
 cout << "Alter von Frisky auf 6 setzen...\n";
 frisky.SetAge(6);
 CAT wiskers;
 cout << "Alter von Wiskers: " << wiskers.GetAge() << endl;
 cout << "Frisky auf Wiskers kopieren...\n";
 wiskers = frisky;
 cout << "Alter von Wiskers: " << wiskers.GetAge() << endl;
 return 0;
}


 

bei Antwort benachrichtigen
thomas woelfer Yves3 „c++: frage zum überladen von operatoren“
Optionen

bei ueberladenen operatoren muss 'this' zurueckgegeben werden, weil es in c++ zulaessig ist sowas hinzuschreiben:

a += b;

in diesem fall liegt eine addition vor deren ergebnis (!) direkt wieder zugewiesen wird. wuerde der ueberladene '+' operator keinen returnwert liefern, koennte man das nicht hinschreiben. den gleichen fall gibts auch bei:

a = b + c + d;

c+d evaluiert hier zu etwas das zu 'b' addiert wird - auch hier braucht der operator+ also einen returnwert.

wegen return *this:

hier hast du einen copy-konstruktor vorliegen. ein konstruktor muss eine instanz des erzeugten objektes liefern:

cat a( b); // b auch 'cat', hinterher 'a' vollstaendig initialisiert.

der einfachste weg das zu tun ist es eben, this zu derefenrenzieren und zurueckzuliefern.

WM_HOPETHISHELPS



this posting contains no tpyos.
bei Antwort benachrichtigen
Yves3 Nachtrag zu: „c++: frage zum überladen von operatoren“
Optionen

bei der addition ist mir jetzt klar, weshalb this zurück gegeben werden muss.
warum aber bei "=", wenn die datenelemente der klasse nur zeiger bzw. referenzen sind und diese ja bereits richtig zugewiesen wurden?

*itsAge = rhs.GetAge();
*itsWeight = rhs.GetWeight();

gehört das einfach zur syntax? gehört das zum sogenannte "guten programmierstil", für den fall, wenn man später noch ein element hinzufügt, dass kein zeiger ist? oder muss eifach etwas zurückgegeben werden, weil es so deklariert wurde und man es hierfür braucht

if(this == &rhs)
return * this;
?

gruss yves

bei Antwort benachrichtigen
thomas woelfer Yves3 „bei der addition ist mir jetzt klar, weshalb this zurück gegeben werden muss....“
Optionen

ich glaube ich verstehe deine frage nicht so ganz: GetAge() hat ueberhaupt _nichts_ mit operator-overloading zu tun. das ist ein ganz normaler accessor der eben einen integer liefert.... (es macht uebrigens nicht besonders viel sinn einen integer per dynamisch allozierten speicher zu verwalten... - aber das ist eine andere frage :))

wie auch immer: was auch immer GetAge() tut - das hat nichts mit dem ueberladen von operatoren zu tun. das das ding was liefert liegt daran das du das so programmiert hast (was ja auch sinn macht), aber nicht daran das man das so tun muesste...

hab aber irgendwie das gefuehl das das deine frage nicht beantwortet, weil ich die wie gesagt nicht verstehe.

WM_FYI

this posting contains no tpyos.
bei Antwort benachrichtigen
Yves3 thomas woelfer „ich glaube ich verstehe deine frage nicht so ganz: GetAge hat ueberhaupt...“
Optionen

meine frage hatte eigentlich auch nichts mit "GetAge" zu tun.
es ging nur darum, dass "itsAge" ein zeiger ist und der wert eben mit diesen codezeilen "*itsAge = rhs.GetAge(); *itsWeight = rhs.GetWeight();" bereits angepasst wurde. da die daten im heap abgelegt sind, bräuchte es(nach meiner überlegung) eigentlich keinen rückgabewert mehr.

zu diesem thema fragte ich, ob die rückgabe des zeigers "this"

a: zur syntax gehört
b: zum guten programmierstil gehört, aber nicht zwingend notwendig ist
c: etwas zurückgeben muss, weil es so deklariert wurde und man den
rückgabewert braucht, wenn "if" "true" ergibt.
oder d:(was sonst?)

weisst du jetzt, was ich meine?

gruss yves

Ps: das programm ist aus einem buch. es geht darum das überladen des operators "=" zu demonstrieren. im buch wurde extra erwähnt, dass das programm in der praxis nie so sein wird ;-)

bei Antwort benachrichtigen
thomas woelfer Yves3 „meine frage hatte eigentlich auch nichts mit GetAge zu tun. es ging nur darum,...“
Optionen

sorry, aber ich kapier beim besten willen nicht was du willst.

GetAge() liegt kein this. warum sollte es auch?

versteh ueberhaupt nicht was du eigentlich fragen willst.

WM_SORRY

this posting contains no tpyos.
bei Antwort benachrichtigen
Yves3 thomas woelfer „sorry, aber ich kapier beim besten willen nicht was du willst. GetAge liegt kein...“
Optionen

oben hast du erklährt, dass man += schreiben kann und daher den zeiger this zurück geben muss.
meiner meinung nach muss man das beim überladen des operators + tun aber nicht zwingend bei "=". warum wurde also in diesem code "this" zurückgegeben?

bei Antwort benachrichtigen
thomas woelfer Yves3 „oben hast du erklährt, dass man schreiben kann und daher den zeiger this...“
Optionen

a = b = c = d;

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Yves3 thomas woelfer „ich glaube ich verstehe deine frage nicht so ganz: GetAge hat ueberhaupt...“
Optionen

sorry das war nicht so gut formuliert.

bei Antwort benachrichtigen
Yves3 Nachtrag zu: „c++: frage zum überladen von operatoren“
Optionen

:-) genau das hat s gebraucht.
jetz kapier ich s, danke!

bei Antwort benachrichtigen