Ich verstehe den Unterschied zwischen Zuweisungskonstruktor und Kopierkonstruktor in C ++ nicht. Es ist so:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Ich möchte wissen, wie der Speicher des Zuweisungskonstruktors und des Kopierkonstruktors zugewiesen wird.
Antworten:
Ein Kopierkonstruktor wird verwendet, um ein zuvor nicht initialisiertes Objekt aus den Daten eines anderen Objekts zu initialisieren .
Beispielsweise:
Ein Zuweisungsoperator wird verwendet, um die Daten eines zuvor initialisierten Objekts durch die Daten eines anderen Objekts zu ersetzen .
Beispielsweise:
Sie könnten die Kopierkonstruktion durch die Standardkonstruktion plus Zuweisung ersetzen, dies wäre jedoch weniger effizient.
(Als Randnotiz: Meine obigen Implementierungen sind genau die, die der Compiler Ihnen kostenlos gewährt. Daher ist es nicht sinnvoll, sie manuell zu implementieren. Wenn Sie eine dieser beiden Implementierungen haben, ist es wahrscheinlich, dass Sie eine Ressource manuell verwalten. In diesem Fall benötigen Sie gemäß der Dreierregel höchstwahrscheinlich auch den anderen plus einen Destruktor.)
quelle
=default;
.= default
, wo ein Standard-Ctor benötigt wird: Die einfache Implementierung eines leeren Körpers selbst zählt immer noch als benutzerdefinierter Ctor und somit (auf einer Standardese-Ebene) ) ist nicht trivial und disqualifiziert den Typ von Klassifikationen, die einen trivialen ctor erfordern.:)
Versuchen Sie noch einmal zu erklären, wovon Sie sprechen?Der Unterschied zwischen dem Kopierkonstruktor und dem Zuweisungsoperator führt bei neuen Programmierern zu großer Verwirrung, ist aber nicht allzu schwierig. Zusammenfassend:
Beispiel für Zuweisungsoperator:
Beispiel für einen Kopierkonstruktor:
quelle
vector <A> v3
und dannv3 = v2
(wov2
ist ein zuvor deklariertes und enthaltendes Elementvector<A>
) denA
Kopierkonstruktor meines expliziten stattdessen aufrufenoperator=
? Ich hatte erwartetoperator=
, anstelle von angerufen zu werden,copy constructor
da meinv3
Objekt bereits zu dem Zeitpunkt deklariert war, an dem ich den Auftrag ausgeführt habeDie erste ist die Kopierinitialisierung, die zweite ist nur die Zuweisung. Es gibt keinen Zuweisungskonstruktor.
verwendet den vom Compiler generierten Kopierkonstruktor.
verwendet den Standardkonstruktor zum Konstruieren
cc
und dann den * Zuweisungsoperator ** (operator =
) für ein bereits vorhandenes Objekt.IDK, was Sie unter Speicherzuweisung in diesem Fall verstehen. Wenn Sie jedoch sehen möchten, was passiert, können Sie:
Ich empfehle Ihnen auch einen Blick auf:
Warum wird der Kopierkonstruktor anstelle des Konvertierungskonstruktors aufgerufen?
Was ist die Dreierregel?
quelle
In einfachen Worten:
Der Kopierkonstruktor wird aufgerufen, wenn aus einem vorhandenen Objekt ein neues Objekt als Kopie des vorhandenen Objekts erstellt wird. Der Zuweisungsoperator wird aufgerufen, wenn einem bereits initialisierten Objekt ein neuer Wert von einem anderen vorhandenen Objekt zugewiesen wird.
Beispiel-
quelle
Was @Luchian Grigore Said so implementiert ist
AUSGABE
Standardkonstruktor
Konstruktor kopieren
Standardkonstruktor
Aufgabenverwalter
quelle
Der Unterschied zwischen einem Kopierkonstruktor und einem Zuweisungskonstruktor ist:
<classname> <o1>=<o2>
)<o1>=<o2>
).Und die grundlegenden Funktionen in beiden sind gleich. Sie kopieren die Daten von o2 nach o1 Mitglied für Mitglied.
quelle
Ich möchte noch einen Punkt zu diesem Thema hinzufügen. "Die Operatorfunktion des Zuweisungsoperators sollte nur als Mitgliedsfunktion der Klasse geschrieben werden." Wir können es nicht als Freundfunktion machen, im Gegensatz zu anderen binären oder unären Operatoren.
quelle
Was Sie zum Kopierkonstruktor hinzufügen sollten:
Wenn Sie ein Objekt als Wert übergeben, wird der Kopierkonstruktor verwendet
Wenn ein Objekt von einer Funktion nach Wert zurückgegeben wird, wird der Kopierkonstruktor verwendet
Beim Initialisieren eines Objekts anhand der Werte eines anderen Objekts (als Beispiel).
quelle