assignment operator überladen gibt keine referenz zurück sondern kopiert
-
Hallo,
Ich lerne gerade C++ und hier sollte beim 2. Ändern von b.set_member(3) auch a.get_member() 3 ausgeben, denn der operator wurde so überschrieben, dass er eine referenz zurückgibt.
#ifndef GUARD_namespacetest_h #define GUARD_namespacetest_h #include <iostream> class NamespaceTest { public: NamespaceTest(int, double); NamespaceTest(const NamespaceTest& ref){ member = ref.member; member2 = ref.member2; std::cout << "1 called." << std::endl; } NamespaceTest& operator=(NamespaceTest& ref){ std::cout << "2 called." << std::endl; return ref; } //int* get_member() const; int get_member(); void set_member(int x); double get_member2() const; private: int member; double member2; }; #endif
#include "NamespaceTest.h" #include "CircularIncludeTest.h" int NamespaceTest::get_member() { return member; } void NamespaceTest::set_member(int x){ member = x; } double NamespaceTest::get_member2() const{ return member2; } NamespaceTest::NamespaceTest(int a, double b): member(a), member2(b){};
#include <iostream> #include <vector> #include "NamespaceTest.h" #include <iterator> #include <string> #include <algorithm> #include <map> #include <iterator> #include <string> int main(){ // constructor called. NamespaceTest a = NamespaceTest(1,2.2); // copy constructor called: NamespaceTest(const NamespaceTest& ref) // prints 1 called. NamespaceTest b = a; b.set_member(2); std::cout << a.get_member() << std::endl; // assignment operator constructor called // prints 2 called. b = a; b.set_member(3); // should print 3 but prints 1 std::cout << a.get_member() << std::endl; return 0; }
-
@fairy2211 sagte in assignment operator überladen gibt keine referenz zurück sondern kopiert:
NamespaceTest b = a;
Das erzeugt eine Kopie. Du müsstest schreiben
NamespaceTest &b = a; // oder: auto &b = a;
Und das hier ist Blödsinn:
NamespaceTest& operator=(NamespaceTest& ref){ std::cout << "2 called." << std::endl; return ref; }
Das solltest du so nicht machen. Du willst stattdessen eine
const &
als Parameter haben, damit du auch non-const Objekte zuweisen kannst.
-
Die Zuweisung
b = a
ist äquivalent zub.operator =(a)
.
Durch die Zuweisungb = a
gibst du zwar eine Referenz zurück, diese wirkt sich aber erst bei weiterer Zuweisung aus, z.B.c = b = a
.Und da du (bisher) keine Änderung in
NamespaceTest& operator=(NamespaceTest& ref)
durchführst, ändert sich auch nichts anb
(und erst recht nicht ana
).
Analog zu deinem letzten Beitrag, solltest du hierNamespaceTest& operator=(const NamespaceTest& ref)
verwenden (damit man die Zuweisung auch für ein konstantes Objekt aufrufen kann und du dieses eben nicht ändern kannst).Außerdem muß man stattdessen
*this
dann als Referenz zurückgeben, damit sich Änderungen dann aufb
(und nichta
auswirken):Namespace &c = b = a; c.set_member(3); std::cout << a.get_member() << std::endl; // gibt weiterhin 1 aus std::cout << b.get_member() << std::endl; // gibt nun 3 aus std::cout << c.get_member() << std::endl; // ebenfalls 3
Edit: @wob, es geht um die Zuweisung
b = a
(in Zeile 23).
-
@Th69 sagte in assignment operator überladen gibt keine referenz zurück sondern kopiert:
Edit: @wob, es geht um die Zuweisung b = a (in Zeile 23).
Ah, hast recht - habe wegen so viel Noise im Code nicht richtig geguckt.
-
Dieser Beitrag wurde gelöscht!
-
cool danke euch beiden!