Empfohlen, 2020

Tipp Der Redaktion

Unterschied zwischen Copy Constructor und Zuweisungsoperator in C ++

Kopierkonstruktor und Zuweisungsoperator sind die zwei Möglichkeiten, um ein Objekt mit einem anderen Objekt zu initialisieren. Der grundlegende Unterschied zwischen dem Kopierkonstruktor und dem Zuweisungsoperator besteht darin, dass der Kopierkonstruktor beiden Objekten, dh dem neu erstellten Zielobjekt und dem Quellobjekt, separaten Speicher zuweist. Der Zuweisungsoperator weist dem neu erstellten Zielobjekt den gleichen Speicherplatz zu Quellobjekt.

Untersuchen wir den Unterschied zwischen dem Kopierkonstruktor und dem Zuweisungsoperator.

Vergleichstabelle

VergleichsgrundlageKonstruktor kopierenAufgabenverwalter
BasicDer Kopierkonstruktor ist ein überladener Konstruktor.Der Zuweisungsoperator ist ein bitweiser Operator.
BedeutungDer Kopierkonstruktor initialisiert das neue Objekt mit einem bereits vorhandenen Objekt.Der Zuweisungsoperator weist den Wert eines Objekts einem anderen Objekt zu, das bereits vorhanden ist.
SyntaxKlassenname (cont Klassenname und Objektname) {
// Körper des Konstruktors
}
Klassenname Ob1, Ob2;
Ob2 = Ob1;
Ruft auf(1) Der Copy-Konstruktor wird aufgerufen, wenn ein neues Objekt mit dem vorhandenen Objekt initialisiert wird.
(2) Das an eine Funktion übergebene Objekt als Nichtreferenzparameter.
(3) Das Objekt wird von der Funktion zurückgegeben.
Der Zuweisungsoperator wird nur aufgerufen, wenn dem vorhandenen Objekt ein neues Objekt zugewiesen wird.
SpeicherzuweisungSowohl das Zielobjekt als auch das Initialisierungsobjekt teilen sich die verschiedenen Speicherorte.Sowohl das Zielobjekt als auch das Initialisierungsobjekt haben denselben zugewiesenen Speicher.
StandardWenn Sie im Programm keinen Kopierkonstruktor definieren, stellt der C ++ - Compiler implizit einen bereit.Wenn Sie den Operator "=" nicht überladen, wird eine bitweise Kopie erstellt.

Definition von Kopierkonstruktor

Ein "Kopierkonstruktor" ist eine Form eines überladenen Konstruktors . Ein Kopierkonstruktor wird nur zu Initialisierungszwecken aufgerufen oder aufgerufen. Ein Kopierkonstruktor initialisiert das neu erstellte Objekt durch ein anderes vorhandenes Objekt. Wenn ein Kopierkonstruktor zum Initialisieren des neu erstellten Zielobjekts verwendet wird, verwenden das Zielobjekt und das Quellobjekt unterschiedliche Speicherorte. Am Quellobjekt vorgenommene Änderungen werden nicht im Zielobjekt übernommen. Die allgemeine Form des Kopierkonstruktors lautet

 Klassenname (Klassenname und Objektname) {. // Körper des Kopierkonstruktors. } // object_name bezieht sich auf das Objekt auf der rechten Seite der Initialisierung. 

Wenn der Programmierer keinen Kopierkonstruktor in einem C ++ - Programm erstellt, stellt der Compiler implizit einen Kopierkonstruktor bereit. Ein impliziter Kopierkonstruktor, der vom Compiler bereitgestellt wird, führt die mitgliederweise Kopie des Quellobjekts aus. Manchmal reicht jedoch die mitgliedsmäßige Kopie nicht aus, da das Objekt eine Zeigervariable enthalten kann. Beim Kopieren einer Zeigervariable wird die in der Zeigervariable gespeicherte Adresse kopiert. Die in der Zeigervariable gespeicherte Adresse soll jedoch nicht kopiert werden. Stattdessen soll der Zeiger kopiert werden, auf den der Zeiger zeigt. Daher ist im Programm ein expliziter Kopierkonstruktor erforderlich, um diese Art von Problemen zu lösen.

Ein Kopierkonstruktor wird unter folgenden drei Bedingungen aufgerufen:

  • Der Copy-Konstruktor wird aufgerufen, wenn ein neues Objekt mit dem vorhandenen Objekt initialisiert wird.
  • Das Objekt wurde als Nichtreferenzparameter an eine Funktion übergeben.
  • Das Objekt wird von der Funktion zurückgegeben.

Lassen Sie uns den Kopierkonstruktor anhand eines Beispiels verstehen.

 Klassenkopie {int num; public: copy () {} // Standardkonstruktor copy (int a) {// Konstruktor initialisieren num = a; } copy (copy & c) {// Konstruktor kopieren num = c.num; } void show () {cout << num; }}; int main () {Kopie A (200); // Objekt A erstellte und initialisierte Kopie B (A); // Copy-Konstruktor mit dem Namen copy C = A; // Kopierkonstruktor mit dem Namen copy D; D = A; // Kopierkonstruktor nicht aufgerufen, da Objekt D nicht neu erstelltes Objekt ist. // es ist eine Zuweisungsoperation. 0 zurückgeben; } 

Im obigen Code hatte ich einen Konstruktor explizit als "copy (copy & c)" deklariert. Dieser Kopierkonstruktor wird aufgerufen, wenn Objekt B mit Objekt A initialisiert wird. Das zweite Mal wird er aufgerufen, wenn Objekt C mit Objekt A initialisiert wird. Wenn Objekt D mit Objekt A initialisiert wird, wird der Kopierkonstruktor nicht aufgerufen, da D initialisiert wird es ist bereits in der Existenz, nicht das neu geschaffene. Daher wird hier der Zuweisungsoperator aufgerufen.

Definition des Zuweisungsoperators

Der Zuweisungsoperator ist ein Zuweisungsoperator von C ++. Der Operator "=" ruft den Zuweisungsoperator auf. Es kopiert die Daten in einem Objekt identisch zu einem anderen Objekt. Der Zuweisungsoperator kopiert ein Objekt in ein anderes Mitglied. Wenn Sie den Zuweisungsoperator nicht überladen, führt er die bitweise Kopie aus. Daher müssen Sie den Zuweisungsoperator überladen.

 Klassenkopie {int num; public: copy () {} // Standardkonstruktor copy (int a) {// Konstruktor initialisieren num = a; } void show () {cout << num; }}; int main () {Kopie A (200); // Objekt A erstellte und initialisierte Kopie B (300); // Objekt B erstellt und initialisiert B = A; // Zuweisungsoperator aufgerufene Kopie C; C = A; // Zuweisungsoperator aufgerufen return 0; } 

In obigem Code wird der Zuweisungsoperator aufgerufen, wenn objectA dem Objekt B zugewiesen wird, da beide Objekte bereits vorhanden sind. Ähnlich ist es der Fall, wenn Objekt C mit Objekt A initialisiert wird.

Wenn die bitweise Zuweisung durchgeführt wird, teilen sich das Objekt denselben Speicherplatz und Änderungen in einem Objekt werden in einem anderen Objekt reflektiert.

Hauptunterschiede zwischen Copy Constructor und Zuweisungsoperator

  1. Ein Kopierkonstruktor ist ein überladener Konstruktor, bei dem als Zuweisungsoperator ein bitweiser Operator verwendet wird.
  2. Mit dem Kopierkonstruktor können Sie ein neues Objekt mit einem bereits vorhandenen Objekt initialisieren. Auf der anderen Seite kopiert ein Zuweisungsoperator ein Objekt in das andere Objekt, die beide bereits vorhanden sind.
  3. Ein Copy-Konstrucor wird immer dann initialisiert, wenn ein neues Objekt mit einem bereits vorhandenen Objekt initialisiert wird, wenn ein Objekt als Nicht-Auffrischungsparameter an eine Funktion übergeben wird oder wenn ein Objekt von einer Funktion zurückgegeben wird. Andererseits wird ein Zuweisungsoperator nur aufgerufen, wenn ein Objekt einem anderen Objekt zugewiesen wird.
  4. Wenn ein Objekt unter Verwendung des Kopierkonstruktors initialisiert wird, teilen sich das Initialisierungsobjekt und das initialisierte Objekt den unterschiedlichen Speicherplatz. Wenn dagegen ein Objekt mit einem Zuweisungsoperator initialisiert wird, teilen sich die initialisierten und initialisierenden Objekte den gleichen Speicherplatz.
  5. Wenn Sie einen Kopierkonstruktor nicht explizit definieren, stellt der Compiler einen zur Verfügung. Wenn Sie hingegen keinen Zuweisungsoperator überladen, wird ein bitweiser Kopiervorgang ausgeführt.

Fazit:

Der Copy-Konstruktor eignet sich am besten zum Kopieren eines Objekts in ein anderes, wenn das Objekt unformatierte Zeiger enthält.

Top