Odporúčaná, 2024

Redakcia Choice

Rozdiel medzi konštruktérom kopírovania a operátorom priradenia v C ++

Konštruktor kopírovania a operátor priradenia sú dva spôsoby inicializácie jedného objektu pomocou iného objektu. Základným rozdielom medzi konštruktérom kopírovania a operátorom priradenia je to, že kopírovací konštruktér prideľuje oddelenú pamäť obom objektom, tj novo vytvorenému cieľovému objektu a zdrojovému objektu. Operátor priradenia prideľuje rovnaké pamäťové miesto novo vytvorenému cieľovému objektu, ako aj zdrojový objekt.

Pozrite sa na rozdiel medzi kopírovacím konštruktérom a operátorom priradenia.

Porovnávacia tabuľka

Základ pre porovnanieKonštruktor kopírovaniaOperátor priradenia
základnéKopírovací konštruktor je preťažený konštruktor.Operátor priradenia je bitový operátor.
zmyselKopírovací konštruktor inicializuje nový objekt s už existujúcim objektom.Operátor priradenia priradí hodnotu jedného objektu inému objektu, ktorý už existuje.
syntaxclass_name (cont name_name & object_name) {
// telo výrobcu
}
class_name Ob1, Ob2;
OB2 = OB1;
vyvolá(1) Konštruktér kopírovania sa spustí pri inicializácii nového objektu s existujúcim objektom.
(2) Objekt prešiel na funkciu ako nereferenčný parameter.
(3) Objekt sa vráti z funkcie.
Operátor priradenia sa vyvolá iba pri priradení existujúceho objektu novým objektom.
Pridelenie pamäteCieľový objekt aj inicializujúci objekt zdieľajú rôzne pamäťové miesta.Cieľový objekt aj inicializujúci objekt zdieľajú rovnakú pridelenú pamäť.
štandardnéAk v programe nedefinujete žiadneho kopírovacieho konštruktora, kompilátor C ++ implicitne poskytuje jeden.Ak operátor "=" nepreťažíte, vykoná sa bitová kópia.

Definícia konštruktora kópií

"Kopírovací konštruktor" je forma preťaženého konštruktora . Konštruktér kopírovania sa volá alebo vyvolá iba na účely inicializácie. Kopírovací konštruktor inicializuje novovytvorený objekt iným existujúcim objektom. Keď sa kopírovací konštruktor použije na inicializáciu novovytvoreného cieľového objektu, potom cieľový objekt aj zdrojový objekt zdieľajú odlišnú pamäťovú polohu. Zmeny vykonané so zdrojovým objektom sa neodrážajú v cieľovom objekte. Všeobecná forma kopírovacieho konštruktora je

 class_name (meno_kategórie a názov_objektu) {. // telo kopírovacieho výrobcu. } // názov_objektu odkazuje na objekt na pravej strane inicializácie. 

Ak programátor v programe C ++ nevytvorí konštruktora kópií, kompilátor implicitne poskytuje kopírovací konštruktor. Implicitný kopírovací konštruktor, ktorý poskytuje kompilátor, robí členskú kópiu zdrojového objektu. Ale niekedy členská kópia nestačí, pretože objekt môže obsahovať premennú ukazovateľa. Kopírovanie ukazovateľa ukazovateľa znamená, že skopírujeme adresu uloženú v premennej ukazovateľa, ale nechceme kopírovať adresu uloženú v ukazovateli ukazovateľa, namiesto toho chceme skopírovať ukazovateľ ukazovateľa. Z tohto dôvodu existuje potreba explicitného "kopírovacieho konštruktora" v programe na vyriešenie takýchto problémov.

Konštruktér kopírovania sa uplatňuje v troch podmienkach:

  • Konštruktor kopírovania sa vyvolá pri inicializácii nového objektu s existujúcim objektom.
  • Objekt prešiel na funkciu ako nereferenčný parameter.
  • Objekt sa vráti z funkcie.

Poďme pochopiť kopírovací konštruktér s príkladom.

 class copy {int num; verejné: copy () {} // predvolená kópia konštruktora (int a) {// inicializačný konštruktor num = a; } kopírovať (kopírovať & c) {// Kopírovať konštruktor num = c.num; } void show () {cout << num; }}; int main () {kópia A (200); // Objekt Vytvorená a inicializovaná kópia B (A); // Konštruktor kopírovania nazývaný kópia C = A; // Konštruktor kopírovania nazývaný kópia D; D = A; // copy constructor nie je volaný, pretože objekt D nie je novo vytvorený objekt. // je to operácia priradenia. návrat 0; } 

V uvedenom kóde som explicitne vyhlásil konštruktora "kopírovať (kopírovať & c)". Tento kopírovací konštruktor sa volá pri inicializácii objektu B pomocou objektu A. Druhýkrát sa volá, keď sa objekt C inicializuje pomocou objektu A. Keď sa objekt D inicializuje pomocou objektu A, kopírovací konštruktor sa neozve, pretože keď sa inicializuje D už je to v existencii, nie novo vytvorená. Preto sa tu volá operátor priradenia.

Definícia operátora priradenia

Operátor priradenia je priradením operátora C ++. Operátor "=" sa používa na vyvolanie operátora priradenia. Skopíruje údaje v jednom objekte identicky s iným objektom. Operátor priradenia kopíruje jeden objekt do iného člena. Ak operátor priradenia nepreťažíte, vykoná bitovú kópiu. Preto musíte preťažiť operátor priradenia.

 class copy {int num; verejné: copy () {} // predvolená kópia konštruktora (int a) {// inicializačný konštruktor num = a; } void show () {cout << num; }}; int main () {kópia A (200); // Objekt Vytvorená a inicializovaná kópia B (300); // Objekt B vytvorený a inicializovaný B = A; // operátor priradenia vyvolal kópiu C; C = A; // operátor pridelenia vyvolaný návrat 0; } 

Vo vyššie uvedenom kóde, keď objekt A je priradený k objektu B, operátor priradenia sa vyvolá, pretože obe objekty už existujú. Podobne je to isté, keď je objekt C inicializovaný objektom A.

Keď sa vykoná bitové priradenie, tak objekt zdieľa rovnaké miesto pamäte a zmeny v jednom objekte sa odrážajú v inom objekte.

Kľúčové rozdiely medzi konštruktérom kopírovania a operátorom priradenia

  1. Kopírovací konštruktor je preťažený konštruktor, kde ako operátor priradenia je bitový operátor.
  2. Pomocou konštruktora kópií môžete inicializovať nový objekt s už existujúcim objektom. Na druhej strane operátor priradenia kopíruje jeden objekt na druhý objekt, pričom oba sú už existujúce.
  3. Konštruktér kopírovania sa inicializuje vždy, keď sa inicializuje nový objekt s už existujúcim objektom, keď sa objekt prenesie na funkciu ako parameter bez odozvy alebo keď sa objekt vráti z funkcie. Na druhej strane operátor priradenia sa vyvolá iba vtedy, keď je objekt priradený inému objektu.
  4. Keď sa objekt inicializuje pomocou konštruktora kópií, inicializačný objekt a inicializovaný objekt zdieľajú odlišnú pamäťovú oblasť. Na druhej strane, keď sa objekt inicializuje pomocou operátora priradenia, potom inicializované a inicializačné objekty zdieľajú rovnaké pamäťové miesto.
  5. Ak explicitne neurčujete konštruktora kópií, potom kompilátor ho vytvorí. Na druhej strane, ak nepreťažíte operátor asigmentu, vykoná sa bitová operácia kopírovania.

záver:

Konštruktor kopírovania je vhodný na kopírovanie jedného objektu do iného, ​​keď objekt obsahuje surové ukazovatele.

Top