004
03.11.2004, 22:28 Uhr
ao
(Operator)
|
Klar, weswegen man die drei hier braucht?
Test enthält einen Zeiger, wenn man den bitweise kopiert, hat man zwei Zeiger (einen in der Original-Instanz, einen in der Kopie-Instanz), die auf denselben Speicherort zeigen.
Problem: Die Instanzen wären nicht voneinander unabhängig, Änderungen an der einen würden auch auf die andere wirken. Und beim Zerstören würde der Speicher, auf den die Pointer zeigen, zweimal freigegeben -> Heap kaputt, ganz schlecht.
Ich füg mal noch eine Überladung für operator= hinzu, damit man mit der Klasse auch was anfangen kann:
C++: |
class Test { public: Test() : myint(new int(0)) {} ~Test() { delete myint; } //copy constuctor Test(const Test& test) : myint(new int(*test.myint)) {}
//zuweisung Test & operator=(const Test& test) { int * temp = new int(*test.myint); delete myint; myint = temp; return *this; }
Test & operator=(int nValue) {*myint = nValue; return *this;}
private: int * myint; };
|
... und jetzt machen wir was damit:
C++: |
int main (void) { Test t1; // Instanz erzeugen und Default-konstruieren t1 = 5; // Wert zuweisen
Test t2 (t1); // andere Instanz erzeugen und als Kopie von t1 konstruieren. // Hier wird der Copy-Ctor verwendet. // t2 hat jetzt auch den Wert 5, jedoch an einer anderen Stelle im Speicher, // das ist wichtig.
t1 = 89; // Wert von t1 ändern; t2 ist immer noch 5.
return 0; } // Hier werden für t1 und t2 die Destruktoren aufgerufen. Das geht gut, weil // jede Instanz ihren eigenen Speicher besitzt.
|
Dieser Post wurde am 03.11.2004 um 22:29 Uhr von ao editiert. |