this und zuweisungsoperator
-
hi!
eine typische implementierung des zuweisungsoperators...warum muss da das object immer als const mit referenz übergeben?
MyString& MyString::operator=( const MyString& str ) { pText_ = new char[ strlen( str.pText_+1 ) ]; strcpy( pText_, str.pText_ ); return *this; } aufruf: MyString str1 = "hallo"; MyString str2; str2 = str1;
*this ist ja das object selber...warum wird da wieder ne referenz zurückgegeben?
cu
-
tcp schrieb:
hi!
eine typische implementierung des zuweisungsoperators...warum muss da das object immer als const mit referenz übergeben?muss es nicht.
aber es ist feiner.MyString& MyString::operator=( MyString str )
tut auch gehen. aber wozu erst bei der übergabe das objekt erst mit dem kopierkonstruktor kopieren, nur um es dann im zuweisungsoperator nochmal zu kopieren und die erste kopie am ende der funktion wegzuschmeißen.
übergabe als referenz ist hier schneller.
übergabe als zeiger würde komischen cod ergeben, wenn man es benutzt. dann mußte man nicht mehrMyString a("hello"); MyString b; b=a;
sondern
MyString a("hello"); MyString b; b=&a;
schreiben müssen. also um ein normales ausshene beim aufruf zu haben und trotzdem speed, nehmen wir eine referenz.
MyString& MyString::operator=( MyString& str )
so. und jetzt klappt auch
MyString a("hello"); MyString b; b=a;
aber es klappt nicht
const MyString a("hello"); MyString b; b=&a;
deswegen nehmen wir eine referent auf const. und dann klappt alles wie erwartet.
*this ist ja das object selber...warum wird da wieder ne referenz zurückgegeben?
damit folgendes geht:
const MyString a("hello"); MyString b; MyString c; c=b=a;
man könnte auch eine referenz auf den übergebenen sting zurückgeben.
MyString& MyString::operator=( const MyString& str ) { pText_ = new char[ strlen( str.pText_+1 ) ]; strcpy( pText_, str.pText_ ); return str; }
aber das führt leider zu einem abkacker bei
const MyString a; MyString &b(a="hello"); MyString c(b);
denn bei a="hello" wird aus dem "hello" geschindt ein temporärer MyString konstruiert und übergeben. der stirbt nach der zuweisung von alleine wieder. die referenz b zeigt auf den toten MyString. das ist böse. und führt zum absturz, wenn man nachher nochmal b anguckt, was ich bei MyString c(b) mache.
also muß man *this zurückgeben. hat ja nach der zuweisung den gleichen wert wie str und keiner merkt's.
edit:
*this ist ja das object selber...warum wird da wieder ne referenz zurückgegeben?
man kännte *this oder str natürlich nicht als referenz, sondern als kopie zurückgeben.
MyString MyString::operator=( const MyString& str ) { pText_ = new char[ strlen( str.pText_+1 ) ]; strcpy( pText_, str.pText_ ); return str; }
dann klappt wieder alles. aber es wäre wieder langsamer als die referenz.
-
hi!
MyString& MyString::operator=( MyString str )
tut auch gehen. aber wozu erst bei der übergabe das objekt erst mit dem kopierkonstruktor kopieren, nur um es dann im zuweisungsoperator nochmal zu kopieren und die erste kopie am ende der funktion wegzuschmeißen.
übergabe als referenz ist hier schneller.
übergabe als zeiger würde komischen cod ergeben, wenn man es benutzt. dann mußte man nicht mehrdu sagtest das geht auch...hab im struppi, bzw in einer auto_ptr klasse mal die pointer version gesehen...
MyString& MyString::operator=( MyString *str ) { pText_ = new char[ strlen( *str.pText_+1 ) ]; strcpy( pText_, *str.pText_ ); return *this; }
jetzt hab ich ja ein problem mit const?
cu
-
tcp schrieb:
du sagtest das geht auch...hab im struppi, bzw in einer auto_ptr klasse mal die pointer version gesehen...
haste nicht.
hast gesehen Ptr operator=(Pointee*) und nicht Ptr operator=(Ptr*).
im MyString sehen wie ja auch einen MyString(char*) ohne Probleme.MyString& MyString::operator=( MyString *str ) { pText_ = new char[ strlen( *str.pText_+1 ) ]; strcpy( pText_, *str.pText_ ); return *this; }
jetzt hab ich ja ein problem mit const?
ja. wegen des umwandlungskosntruktors MyString(char*) oder MyString(const char*).
-
volkard schrieb:
man könnte auch eine referenz auf den übergebenen sting zurückgeben.
MyString& MyString::operator=( const MyString& str ) { pText_ = new char[ strlen( str.pText_+1 ) ]; strcpy( pText_, str.pText_ ); return str; }
Nicht ganz, da const MyString& nicht implizit in MyString& umgewandelt werden kann.
-
muss es nicht.
aber es ist feiner.
C/C++ Code:
MyString& MyString::operator=( MyString str )
C/C++ Code:
MyString& MyString::operator=( MyString str )
C/C++ Code:
MyString& MyString::operator=( MyString str )tut auch gehen. aber wozu erst bei der übergabe das objekt erst mit dem kopierkonstruktor kopieren, nur um es dann im zuweisungsoperator nochmal zu kopieren und die erste kopie am ende der funktion wegzuschmeißen.
übergabe als referenz ist hier schneller.Andererseits bietet sich diese Klasse aber geradezu für das Swap-Idiom an, und dann ist die Übergabe als Kopie wieder kürzer
MyString& MyString::operator=(MyString str) { Swap(str); return *this; }
Korrekten Copy-Konstruktor und Swap-Funktion natürlich vorausgesetzt:
MyString::MyString(const MyString ©) : pText_(new char[strlen(copy.pText_)+1]) { strcpy(pText_, copy.pText_); } void MyString::Swap(MyString &other) // throw() { std::swap(pText_, other.pText_); }
Dadurch vergisst man bei der Zuweisung auch nicht, pText_ vorher zu löschen
Das macht dann nämlich der Destruktor von str...
-
@ Volkard:
Wieso machst du dir die Mühe? Gib doch n Link zu deiner ja jetzt wieder funktionierenden Homepage bzw. den Kurs... da stehts doch fast wort-wörtlich drin.
Mr. B
-
Mr. B schrieb:
@ Volkard:
Wieso machst du dir die Mühe? Gib doch n Link zu deiner ja jetzt wieder funktionierenden Homepage bzw. den Kurs... da stehts doch fast wort-wörtlich drin.aus langeweile?
aber groovemasters kommentar hat den einsatz schon für mich lohnend gemacht. wenn ich wiedermal jemandem vormachen muß, wo alles tücken lauern, hab ich eine mehr im schatzkistlein.