Doporučená, 2021

Redakce Choice

Rozdíl mezi Copy Constructor a Assignment Operator v C ++

Kopírovat konstruktor a operátor přiřazení jsou dva způsoby inicializace jednoho objektu pomocí jiného objektu. Základním rozdílem mezi konstruktorem kopírování a operátorem přiřazení je, že konstruktor kopírování přiděluje samostatnou paměť oběma objektům, tj. Nově vytvořenému cílovému objektu a zdrojovému objektu. Operátor přiřazení přiděluje nově vytvořenému cílovému objektu stejné umístění paměti a také zdrojový objekt.

Prozkoumejme rozdíl mezi konstruktorem kopií a operátorem přiřazení.

Srovnávací graf

Základ pro porovnáníKopírovat konstruktorOperátor přiřazení
ZákladníKonstruktor kopií je přetěžovaný konstruktor.Operátor přiřazení je bitový operátor.
VýznamKonstruktor kopií inicializuje nový objekt s již existujícím objektem.Operátor přiřazení přiřazuje hodnotu jednoho objektu jinému objektu, který již existuje.
Syntaxclass_name (cont class_name & object_name) {
// tělo konstruktoru
}
class_name Ob1, Ob2;
Ob2 = Obl;
Vyvolává(1) Konstruktor kopírování vyvolá, když je nový objekt inicializován existujícím objektem.
(2) Objekt předán funkci jako parametr bez odkazu.
(3) Objekt je vrácen z funkce.
Operátor přiřazení je vyvolán pouze při přiřazení existujícího objektu novému objektu.
Přidělení pamětiCílový objekt i inicializační objekt sdílí různá umístění paměti.Cílový objekt i inicializační objekt sdílí stejnou přidělenou paměť.
VýchozíPokud v programu nedefinujete žádný konstruktor kopií, kompilátor C ++ implicitně poskytne jeden.Pokud nepřetěžujete operátora "=", bude provedena bitová kopie.

Definice konstruktoru kopírování

„Konstruktor kopírování“ je forma přetíženého konstruktoru . Konstruktor pro kopírování je vyvolán nebo vyvolán pouze pro účely inicializace. Konstruktor kopií inicializuje nově vytvořený objekt jiným existujícím objektem. Když je konstruktor kopírování použit k inicializaci nově vytvořeného cílového objektu, sdílí cílový objekt i zdrojový objekt jiné umístění paměti. Změny provedené ve zdrojovém objektu se v cílovém objektu neodrážejí. Obecná forma konstruktoru kopií je

 název_třídy (název_třídy a název_objektu) {. // tělo konstruktoru kopií. } // název_objektu odkazuje na objekt na pravé straně inicializace. 

Pokud programátor nevytváří konstruktor kopií v programu C ++, pak kompilátor implicitně poskytuje konstruktor kopírování. Implicitní konstruktor kopií poskytovaný kompilátorem provede kopii zdrojového objektu v členském formátu. Někdy však není členská kopie dostatečná, protože objekt může obsahovat proměnnou ukazatele. Kopírování proměnné ukazatele znamená, že zkopírujeme adresu uloženou v proměnné ukazatele, ale nechceme kopírovat adresu uloženou v proměnné ukazatele, místo toho chceme kopírovat, na který ukazatel ukazuje. Proto je v programu potřeba explicitní konstruktér kopií, který by tento problém vyřešil.

Konstruktor pro kopírování je vyvolán ve třech podmínkách:

  • Konstruktor kopírovat vyvolá, když je nový objekt inicializován existujícím objektem.
  • Objekt předán funkci jako parametr bez odkazu.
  • Objekt je vrácen z funkce.

Pojďme pochopit konstruktor kopií s příkladem.

 kopie třídy {int num; public: copy () {} // výchozí konstruktor copy (int a) {// inicializace konstruktoru num = a; } copy (copy & c) {// Kopírovat konstruktor num = c.num; } void show () {cout << num; }}; int main () {kopie A (200); // Objekt A vytvořený a inicializovaný kopii B (A); // Kopírovat konstruktor nazvaný kopie C = A; // Kopírovat konstruktor nazvaný kopie D; D = A; // kopírovat konstruktor, který není volán, protože objekt D není nově vytvořený objekt. // je to operace přiřazení. návrat 0; } 

Ve výše uvedeném kódu jsem výslovně deklaroval konstruktor „copy (copy & c)“. Tento konstruktor kopírování je volán, když je objekt B inicializován pomocí objektu A. Podruhé, když je objekt C inicializován pomocí objektu A. Když je objekt D inicializován pomocí objektu A, konstruktor kopírování není volán, protože když je D inicializován je to již v existenci, ne nově vytvořené. Zde je tedy vyvolán operátor přiřazení.

Definice operátora přiřazení

Operátor přiřazení je přiřazující operátor C ++. Operátor „=“ slouží k vyvolání operátoru přiřazení. Kopíruje data v jednom objektu shodně s jiným objektem. Operátor přiřazení zkopíruje jeden objekt do jiného člena. Pokud nepřesáhnete operátora přiřazení, provede bitovou kopii. Proto je nutné přetížit operátora přiřazení.

 kopie třídy {int num; public: copy () {} // výchozí konstruktor copy (int a) {// inicializace konstruktoru num = a; } void show () {cout << num; }}; int main () {kopie A (200); // Objekt A vytvořený a inicializovaný kopii B (300); // Objekt B vytvořen a inicializován B = A; // operátor přiřazení vyvolal kopii C; C = A; // operátor přiřazení vyvolán return 0; } 

Ve výše uvedeném kódu při přiřazení objektu objectA objektu B je operátor přiřazení vyvolán, protože oba objekty již existují. Podobně je tomu i v případě, kdy je objekt C inicializován objektem A.

Když se provádí bitové přiřazení, objekt sdílí stejné umístění paměti a změny v jednom objektu se odrážejí v jiném objektu.

Klíčové rozdíly mezi kopírovacím konstruktorem a operátorem přiřazení

  1. Konstruktor kopírování je přetížený contructor, kde jako operátor přiřazení je bitový operátor.
  2. Pomocí konstruktoru kopírování můžete inicializovat nový objekt s již existujícím objektem. Na druhé straně operátor přiřazení zkopíruje jeden objekt do jiného objektu, z nichž oba již existují.
  3. Konstrukce kopie je inicializována vždy, když je nový objekt inicializován s již existujícím objektem, když je objekt předán funkci jako parametr bez refrence nebo když je objekt vrácen z funkce. Na druhé straně je operátor přiřazení vyvolán pouze tehdy, když je objekt přiřazen jinému objektu.
  4. Když je objekt inicializován pomocí konstruktoru kopií, inicializační objekt a inicializovaný objekt sdílí jiné umístění paměti. Na druhé straně, když je objekt inicializován pomocí operátoru přiřazení, pak inicializované a inicializační objekty sdílí stejné umístění paměti.
  5. Pokud explicitně nedefinujete konstruktor kopií, pak kompilátor poskytne jeden. Na druhé straně, pokud nepřesáhnete operátora přiřazení, provede se operace bitového kopírování.

Závěr:

Konstruktor Copy je nejlepší pro kopírování jednoho objektu do jiného, ​​když objekt obsahuje surové ukazatele.

Top