Prozkoumejme rozdíl mezi konstruktorem kopií a operátorem přiřazení.
Srovnávací graf
Základ pro porovnání | Kopírovat konstruktor | Operátor přiřazení |
---|---|---|
Základní | Konstruktor kopií je přetěžovaný konstruktor. | Operátor přiřazení je bitový operátor. |
Význam | Konstruktor 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. |
Syntax | class_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ěti | Cí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í
- Konstruktor kopírování je přetížený contructor, kde jako operátor přiřazení je bitový operátor.
- 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í.
- 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.
- 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.
- 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.