2017-02-05 6 views
0
using namespace std; 

class C { 

public: 

    char *s; 

    C(const char *s0) { 
     s = new char[strlen(s0)+1]; 
     strcpy(s,s0); 
    } 

    C(C &c) { 
     s = new char[strlen(c.s)+1]; 
     strcpy(s,c.s); 
    } 
}; 

int main(int argc, char* argv[]) { 

    C c("cde"); 
    C c0(c); 

    cout << c.s << endl; 
    cout << c0.s << endl; 

    c.s[1] = 'X'; 

    cout << c.s << endl; 
    cout << c0.s << endl; 
} 

Ich bin nicht so sicher, was mit den Zeigern und Referenzen passiert. Kann jemand erklären, warum die Ausgabe für die zweite c0.s immer noch "cde" ist? Vielen Dank.C++ Kopierkonstruktor, kann jemand erklären warum?

+1

Was Sie erwarten sind 'c0.s' zu sein? Und warum? –

+1

Weil es eine * Kopie * macht? – juanchopanza

+0

'c0' ist eine Kopie, also ändert' c' es nicht. – Galik

Antwort

2

Der Copykonstruktor schafft einen neuen Puffer

s = new char[strlen(c.s)+1]; 

und Kopieren der Inhalte des Puffers des Originals in den neuen Puffer

strcpy(s,c.s); 

so beide Objekte separate Puffer enthalten. Durch die Änderung eines Objekts wird der Puffer dieses Objekts geändert, sodass keine Änderungen an dem anderen Objekt vorgenommen werden.

Wenn der Copykonstruktor etwas sieht aus wie diese

C(C &c) { 
    s = c.s; 
} 

das Standard-Kopierverhalten zu replizieren, würden beiden Objekte auf den gleichen Puffer beziehen und Änderungen an einen im anderen erscheinen würden.

Wenn ein Destruktor implementiert wurde, um den Puffer zu löschen und ein Lecken des dem Puffer zugeordneten Speichers zu verhindern, wäre dies fatal. Das Zerstören eines Objekts würde den Puffer für beide freigeben und früher oder später würde auf den ungültigen Puffer entweder zugegriffen oder er würde gelöscht.

Weitere lesen What is The Rule of Three?