2

C++ Unterschied Copy-Konstruktor vs. Zuweisungsoperator?

Frage von Consta Consta

Hi Leute,

was ist denn nun der konrekte Unterschied zwischen dem Copy-Konstruktor und dem  Zuweisungsoperator? Ich hab hier einen Quelltext vor mir liegen bei dem beide im Grunde dasselbe machen:

//Copy-Konstruktor

Test::Test (const Test  &a) : size(a.size), p(new int[size]) {

  for (int i = 0; i  p[i] = a.p[i];
}
}

//Zuweisungsoperator

 

Test &Test ::operator=(const Test  &a) {

if (this != &a) {
 for (int i = 0; i  p[i] = a.p[i];
}
}

return *this;
}

Beide übergeben ja dem neuen Objekt das alte Array ( p[ ] ), also kopieren es oder weisen es neu zu...wo ist der Unterschied?

Fragen zu gleichen Themen finden

Antworten (2)

  • 2
    RatgeberHelden Antwort von Dory1 Dory1

    Kopier-Konstruktor und Zuweisungsoperator sind für Kopieraktionen zuständig. Sie sind sich darum auch sehr ähnlich. Die geringen Unterschiede rühren daher, dass zum einen der Zuweisungsoperator einen alten Wert vorfindet, der weggeräumt werden muss, und dass er zum anderen einen Wert liefern muss. Die Zuweisung einer Variable an sich selbst (l=l;) funktioniert mit dem Kopieralgorithmus nicht. Sie muss darum abgefangen werden. Glücklicherweise ist Nichtstun eine korrekte Implementierung einer Zuweisung an sich selbst. http://velociraptor.mni.fh-giessen.de/Programmierung/ProgII-htmldir/node6.html

     

    Vielleicht bringt dir das was?

    Kommentar von Dory1 Dory1Dory1

    (...) Der Hauptunterschied zwischen Kopierkonstruktor und Zuweisungsoperator besteht darin, dass bei einer Zuweisung das Zielobjekt bereits existiert. Das heißt, das Zielobjekt hatte vor der Zuweisung bereits einen externen Datenbereich, der über seinen Zeiger zugreifbar war. Dieser Zeiger wird aber bei einer Bit-für-Bit-Kopie durch die Zuweisung überschrieben und zeigt anschließend auf den Datenbereich des Quellobjekts (...)  http://www.willemer.de/informatik/cpp/cppovrld.htm

    Kommentar von Consta ConstaConsta

    Ja hat mir beim Verständis geholfen! Der Unterschied wird jetzt deutlicher. Danke!

    Kommentar von wolfgang1956 wolfgang1956wolfgang1956

    Unter einer Zuweisung versteht man etwas völlig anderes wie unter einem Konstruktor oder Copy-Konstruktor.

    Die Zuweisung weist einem L-Wert das Ergebnis berechneter R-Werte zu.

    Konstruktoren und Copy-Konstruktoren erzeugen neue Objekte!

    Kommentar von wolfgang1956 wolfgang1956wolfgang1956

    Hier ein Link zu einem Buch über Java, das eine sehr ähnliche Syntax hat. Dort kommt auch niemand auf die Idee, einen Zuweisungsoperator mit einem Copy-Konstruktor zu vergleichen. http://openbook.galileocomputing.de/javainsel/

     

  • 1
    RatgeberHelden Antwort von wolfgang1956 wolfgang1956

    Unter einer Zuweisung versteht man etwas völlig anderes wie unter einem Konstruktor oder Copy-Konstruktor.

    Die Zuweisung weist einem L-Wert (Meist eine Variable oder deren Adresse) das Ergebnis berechneter R-Werte (Hier können auch Konstanten eingesetzt werden) zu.

    Konstruktoren und Copy-Konstruktoren erzeugen neue Objekte!

    Dein „Zuweisungoperator“ ist eine falsche Funktionsdefinition, die zudem falsch geklammert ist! Weder in der Deklaration noch in der Definition einer Funktion kommt ein Gleichheitszeichen vor!

    Der Teilausdruck int i = 0 weist der Variablen (L-Wert) i die Konstante (R-Wert) 0 zu. Das Zeichen = ist der Zuweisungsoperator. Dies hat rein gar nichts mit Objekterzeugung zu tun!

    Objekte werden mit einem Konstruktor oder Copy-Konstruktor erzeugt.

Diese Frage

Verwandte Fragen

Noch nicht den richtigen Rat gefunden?

Einfach und schnell viele hilfreiche Ratschläge von Deutschlands aktivster Ratgeber-Community erhalten!

Einfach und schnell einen Tipp erstellen und Ihren guten Rat mit anderen teilen!

Einfach und schnell ein Video hochladen und anschaulichen Rat an alle geben!

Die unter gutefrage.net angebotenen Dienste und Ratgeber Inhalte werden nicht geprüft. Die Richtigkeit der Inhalte wird nicht gewährleistet. Rechtliche Hinweise finden Sie hier.