Was ist ein copy-Konstruktor in C++?
Seite 6 von Scott Meyers 's effective C++ wird die Bezeichnung" Kopie-Konstruktor " ist definiert. Ich habe mit Schiltdt Buch als meine Referenz und ich finde keine Erwähnung von copy-Konstruktoren. Ich bekomme die Ahnung, aber ist das ein standard-Teil von c++? Solche Konstruktoren aufgerufen werden, wenn eine Klasse als Wert übergeben?
- Naja, das wäre typisch für Schildt - warum auf der Erde gehen die Menschen mit seinen Büchern?
- Bitte, nehmen Sie nicht Schildt Bücher ohne ein Körnchen Salz. Google für den Begriff "Bullschildt" und sehen Sie selbst. Mehr ernst, Lesen Sie Bewertungen von Schildt Bücher auf ACCU; die meisten von Ihnen sind nicht günstig.
- obwohl ich habe auch gehört, schlechte Dinge über Schildt Bücher, es ist einfach schwer zu glauben, dass es nicht sprechen über copy-Konstruktoren.
- Nicht verwenden, Schildt-Bücher. Versuchen Accelerated C++, §11.3. Sie werden es mir später danken.
- In meiner Erfahrung, Schildt Bücher finden Sie unter C++ als "C mit extra-Stücken", sondern als eine neue Sprache, abgeleitet von C, so oft er findet den Punkt, mit Funktionen wie diese. Versuchen Sie, James B Coplien 's C++ - Stil und die Idiome' für den Vergleich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen copy-Konstruktor hat folgende form:
Folgende Beispiel zeigt, wo es aufgerufen wird.
foo
hat der Prototypvoid foo(example x);
. Zum Beispielvoid foo(const example& x);
nicht rufen Konstruktoren. Odervoid foo(int x);
die rufen möglicherweise ein cast-operatoroperator int()
wenn nicht zu einem compiler-Fehler.Ja, copy Konstruktoren sind sicherlich ein wesentlicher Teil von standard-C++. Lesen Sie mehr über Sie (und die anderen Konstruktoren) hier (C++ FAQ).
Wenn Sie ein C++ - Buch, das lehrt nicht über copy-Konstruktoren, es wegzuwerfen. Es ist ein schlechtes Buch.
Sehen Copy-Konstruktor auf Wikipedia.
Ist der Grundgedanke der copy-Konstruktoren instanziieren, neue Instanzen durch kopieren bestehender:
Gegeben eine Instanz
foo
aufrufen der copy Konstruktor mitoder
Die Standard Template Library Container benötigen Objekte kopierbar und zuweisbar, so dass, wenn Sie verwenden möchten
std::vector<YourClass>
, sicher sein, zu definieren, eine angemessene Kopie-Konstruktor undoperator=
wenn der compiler-generierte Vorschläge machen keinen Sinn.Copy-Konstruktor wird aufgerufen, in der dann folgenden Szenarien:
Beim erstellen neuer Objekte aus einem vorhandenen Objekt ist.
oder
Beim übergeben der Klasse ein Objekt von Wert.
Oben MyClass-Objekt als Wert übergeben. Also copy-Konstruktor von MyClass anrufen. Pass by reference zu vermeiden, copy-Konstruktor aufrufen.
Beim zurückgeben von Objekten, die von Wert
Oben MyClass zurückgegeben wird, die von Wert, So dass copy-Konstruktor von MyClass anrufen. Pass by reference zu vermeiden, copy-Konstruktor aufrufen.
Copy-Konstruktor ist ein wesentlicher Bestandteil von C++. Auch wenn Sie eine C++ - compiler bietet Standard-copy-Konstruktor, wenn überhaupt, wenn wir nicht definieren, Sie explizit in der Klasse, die Wir schreiben, copy-Konstruktor für die Klasse, für die folgenden zwei Gründe.
die 2 Objekte auf den gleichen Speicherbereich.)
Um eine Tiefe Kopie, Sie schreiben muss eine Kopie-Konstruktor und überlastung der Zuweisungsoperator, sonst wird die Kopie auf das original, mit verheerenden Folgen.
Den copy-Konstruktor-syntax geschrieben werden kann wie folgt:
Den C++ - FAQ-link gepostet von Eli ist nett und gbacon post ist korrekt.
Explizit beantworten, den zweiten Teil Ihrer Frage: ja, wenn Sie ein Objekt übergeben Instanz durch den Wert der copy-Konstruktor zum erstellen der lokalen Instanz des Objekts in der scope der Funktion nennen. Jedes Objekt hat eine "default-copy-Konstruktor" (gbacon, deutet Sie dies als "compiler-generierte default"), die einfach kopiert jedes Objekt Mitglied - das kann nicht sein, was Sie wollen, wenn Sie Ihre Objekt-Instanzen enthalten, die Zeiger oder Referenzen, zum Beispiel.
Bezüglich gute Bücher für (wieder -) lernen C++ - ich lernte Sie vor fast zwei Jahrzehnten und es hat sich ein guter deal, da dann - ich empfehle Bruce Eckel ' s "Thinking in C++" Versionen 1 und 2 frei verfügbar hier (im PDF-und HTML-form):
http://www.ibiblio.org/pub/docs/books/eckel/