Frage Was ist der Unterschied zwischen Zuweisungsoperator und Kopierkonstruktor?


Ich verstehe den Unterschied zwischen dem Zuweisungskonstruktor und dem Kopierkonstruktor in C ++ nicht. Es ist wie dieses:

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 man Speicher des Zuweisungskonstruktors und des Kopierkonstruktors zuweist?


76
2017-07-29 01:56


Ursprung


Antworten:


EIN Konstruktor kopieren wird verwendet, um a zu initialisieren zuvor nicht initialisiert Objekt aus den Daten eines anderen Objekts.

A(const A& rhs) : data_(rhs.data_) {}

Ein Aufgabenverwalter wird verwendet, um die Daten von a zu ersetzen zuvor initialisiert Objekt mit den Daten eines anderen Objekts.

A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}

Sie könnten die Kopierkonstruktion durch die Standardkonstruktion plus Zuweisung ersetzen, aber das wäre weniger effizient.

(Als Nebenbemerkung: Meine obigen Implementierungen sind genau diejenigen, die der Compiler Ihnen kostenlos zur Verfügung stellt, daher wäre es nicht sinnvoll, sie manuell zu implementieren. Wenn Sie eine dieser beiden Möglichkeiten haben, ist es wahrscheinlich, dass Sie einige Ressourcen manuell verwalten. In diesem Fall, per Die Regel der Drei, Sie werden sehr wahrscheinlich auch den anderen und einen Destruktor brauchen.)


110
2017-07-29 02:07



Der Unterschied zwischen dem Kopierkonstruktor und dem Zuweisungsoperator verursacht eine Menge Verwirrung für neue Programmierer, aber es ist wirklich nicht so schwierig. Zusammenfassend:

  • Wenn vor dem Kopieren ein neues Objekt erstellt werden muss, wird der Kopierkonstruktor verwendet.
  • Wenn vor dem Kopieren kein neues Objekt erstellt werden muss, wird der Zuweisungsoperator verwendet.

Beispiel für Zuweisungsoperator:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

Beispiel für einen Kopierkonstruktor:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor

24
2017-07-23 12:13



Die erste ist die Kopierinitialisierung, die zweite ist nur eine Zuweisung. Es gibt keinen Zuweisungskonstruktor.

A aa=bb;

verwendet den vom Compiler erstellten Kopierkonstruktor.

A cc;
cc=aa;

verwendet den Standardkonstruktor zum Konstruieren ccund dann der * Zuweisungsoperator ** (operator =) auf ein bereits bestehendes Objekt.

Ich will wissen, wie man Speicher des Zuweisungskonstruktors und des Kopierkonstruktors zuweist?

IDK was du meinst, indem du Speicher in diesem Fall reservierst, aber wenn du sehen willst was passiert, kannst du:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

Ich empfehle Ihnen auch einen Blick auf:

Warum wird der Kopierkonstruktor anstelle des Konvertierungskonstruktors aufgerufen?

Was ist die Regel der Drei?


18
2017-07-29 02:00



Der Unterschied zwischen einem Kopierkonstruktor und einem Zuweisungskonstruktor ist:

  1. Im Falle eines Kopierkonstruktors wird ein neues Objekt erstellt.<classname> <o1>=<o2>)
  2. Im Falle eines Zuweisungskonstruktors wird kein Objekt erstellt, dh es wird auf bereits erstellte Objekte angewendet (<o1>=<o2>).

Und die grundlegenden Funktionalitäten in beiden sind gleich, sie werden die Daten von O2 zu O1 Mitglied für Mitglied kopieren.


2
2018-01-01 12:35



Was @Luchian Grigore Said ist so implementiert

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

AUSGABE


Standardkonstruktor


Konstruktor kopieren


Standardkonstruktor


Aufgabenverwalter



1
2018-03-03 07:04



Etwas zum Kopierkonstruktor hinzufügen:

  • Wenn ein Objekt als Wert übergeben wird, wird der Kopierkonstruktor verwendet

  • Wenn ein Objekt von einer Funktion als Wert zurückgegeben wird, wird der Kopierkonstruktor verwendet

  • Bei der Initialisierung eines Objekts mit den Werten eines anderen Objekts (als Beispiel geben Sie an).


1
2018-01-24 11:28



In einfachen Worten,

Der Kopierkonstruktor wird aufgerufen, wenn ein neues Objekt aus einem vorhandenen Objekt als Kopie des vorhandenen Objekts erstellt wird. Und der Zuweisungsoperator wird aufgerufen, wenn einem bereits initialisierten Objekt ein neuer Wert von einem anderen vorhandenen Objekt zugewiesen wird.

Beispiel-

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"

1
2018-02-19 20:35