Priporočena, 2024

Izbira Urednika

Razlika med konstruktorjem za kopiranje in operaterjem dodelitve v C ++

Kopiraj konstruktor in operater dodelitve sta dva načina za inicializacijo enega objekta z drugim predmetom. Temeljna razlika med operaterjem konstruktorja kopiranja in operaterjem dodelitve je, da konstruktor kopiranja dodeli ločen pomnilnik za oba objekta, tj. Novo ustvarjen ciljni objekt in izvorni objekt. Operator dodelitve dodeli novo pomnilniško mesto novo ustvarjenemu ciljnemu objektu, kot tudi izvorni predmet.

Preučimo razliko med konstruktorjem in operaterjem dodelitve.

Primerjalna tabela

Podlaga za primerjavoKopiraj konstruktorjaOperator dodelitve
OsnovnoKonstruktor kopiranja je preobremenjen konstruktor.Operator dodelitve je bitni operator.
PomenKonstruktor kopiranja inicializira nov objekt z že obstoječim objektom.Operater dodelitve dodeli vrednost enega predmeta drugemu objektu, ki sta že v obstoječem.
Sintaksaime_kaza (cont class_name & ime_objekta) {
// telo konstruktorja
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Povabi(1) Kopiranje konstruktorja se pokliče, ko je nov objekt inicializiran z obstoječim.
(2) Objekt je posredovan funkciji kot nereferenčni parameter.
(3) Objekt se vrne iz funkcije.
Operator dodelitve se prikliče samo, ko obstoječi objekt dodeli nov objekt.
Dodelitev pomnilnikaCiljni objekt in objekt za inicializacijo si delita različne pomnilniške lokacije.Tako ciljni objekt kot objekt inicializacije delita isti dodeljeni pomnilnik.
PrivzetoČe v programu ne definirate nobenega konstruktorja za kopiranje, ga prevajalnik C ++ implicitno zagotovi.Če operaterja "=" ne preobremenite, bo izdelana bitna kopija.

Opredelitev kopirnega konstruktorja

»Kopirni konstruktor« je oblika preobremenjenega konstruktorja . Konstruktor kopiranja se kliče ali kliče samo za namen inicializacije. Konstruktor kopiranja inicializira novoustanovljeni objekt z drugim obstoječim objektom. Ko se konstruktor kopiranja uporablja za inicializacijo na novo ustvarjenega ciljnega objekta, potem tako ciljni objekt kot izvorni objekt si delita različno lokacijo pomnilnika. Spremembe v izvornem objektu se ne odražajo v ciljnem objektu. Splošna oblika konstruktorja kopiranja je

 ime_klasa (ime_nahoda in ime_objekta) {. // telo konstruktorja kopiranja. } // object_name se nanaša na objekt na desni strani inicializacije. 

Če programer ne ustvari konstruktorja kopiranja v programu C ++, potem prevajalnik implicitno zagotovi konstruktor kopiranja. Implicitni konstruktor kopiranja, ki ga zagotavlja prevajalnik, izvede člansko izvorno kodo izvornega objekta. Včasih pa kopija člana ni dovolj, saj lahko objekt vsebuje spremenljivko kazalca. Ko kopiramo spremenljivko kazalca, kopiramo naslov, shranjen v spremenljivki kazalca, vendar ne želimo kopirati naslova, ki je shranjen v spremenljivki kazalca, namesto tega želimo kopirati, na kar kaže kazalec. Zato je v programu potrebno izrecno „kopirati konstruktorja“ za reševanje tovrstnih težav.

Konstruktor kopiranja se prikliče v treh pogojih, kot sledi:

  • Kopiraj konstruktor pokliče, ko je nov objekt inicializiran z obstoječim.
  • Objekt je posredovan funkciji kot ne-referenčni parameter.
  • Objekt se vrne iz funkcije.

Razumimo konstruktor kopiranja s primerom.

 kopija razreda {int num; public: copy () {} // privzeta kopija konstruktorja (int a) {// inicializirajoči konstruktor num = a; } copy (copy & c) {// Kopiraj konstruktor num = c.num; } void show () {cout << num; }}; int main () {copy A (200); // Objekt je ustvaril in inicializiral kopijo B (A); // Kopiraj konstruktor, imenovan kopija C = A; // Kopiraj konstruktor, imenovan kopija D; D = A; // kopirni konstruktor se ne kliče, ker objekt D ni novonastali objekt. // je operacija dodelitve. return 0; } 

V zgornji kodi sem izrecno prijavil konstruktorja »copy (copy & c)«. Ta konstruktor kopiranja se kliče, ko je objekt B inicializiran z objektom A. Drugi čas, ko je bil klicani objekt C inicializiran z objektom A. Ko je objekt D inicializiran z objektom A, se konstruktor kopiranja ne pokliče, ker se pri inicializaciji D že je v obstoju, ne v novo ustvarjenem. Torej, tukaj se prikliče operater dodelitve.

Opredelitev operaterja dodelitve

Operator dodelitve je operater dodeljevanja C ++. Operator "=" se uporablja za priklic operaterja dodelitve. Podatke v enem predmetu kopira enako kot drug objekt. Operater dodelitve kopira en predmet v drugega člana. Če operaterja dodelitve ne preobremenite, izvede bitno kopijo. Zato morate preobremeniti operaterja dodelitve.

 kopija razreda {int num; public: copy () {} // privzeta kopija konstruktorja (int a) {// inicializirajoči konstruktor num = a; } void show () {cout << num; }}; int main () {copy A (200); // Objekt je ustvaril in inicializiral kopijo B (300); // Objekt B ustvarjen in inicializiran B = A; // operater dodelitve, ki je bil priklican kopija C; C = A; // priklicani operater za vrnitev 0; } 

V zgornji kodi, ko je objekt A dodeljen objektu B, se uveljavi operater dodelitve, ker oba objekta že obstajata. Podobno velja tudi za primer, ko je objekt C inicializiran z objektom A.

Ko je bitna dodelitev izvedena, si objekt deli isto pomnilniško mesto in spremembe v enem predmetu se odražajo v drugem objektu.

Ključne razlike med konstruktorjem za kopiranje in operaterjem dodelitve

  1. Konstruktor kopiranja je preobremenjen gradnik, kjer je kot operater dodelitve bitni operator.
  2. Z uporabo konstruktorja kopiranja lahko inicializirate nov objekt z že obstoječim objektom. Po drugi strani pa operater dodelitve kopira en predmet na drugi predmet, ki sta že v obstoječem.
  3. Konstrukcija kopiranja se inicializira vedno, ko je nov objekt inicializiran z že obstoječim objektom, ko je objekt posredovan funkciji kot parameter brez refrenca ali ko se objekt vrne iz funkcije. Po drugi strani pa se operater dodelitve pokliče samo, ko je predmet dodeljen drugemu objektu.
  4. Ko se objekt inicializira z uporabo konstruktorja kopije, predmet inicializacije in inicializirani objekt si delita različni pomnilniški lokaciji. Po drugi strani pa, ko se objekt inicializira z uporabo operaterja dodelitve, inicializirani in inicializirani objekti delijo isto pomnilniško mesto.
  5. Če izrecno ne določite konstruktorja kopiranja, ga prevajalnik zagotovi. Po drugi strani pa, če ne preobremenite operaterja dodelitve, se izvede operacija kopiranja po bitovih.

Sklep:

Konstruktor kopiranja je najboljši za kopiranje enega objekta v drugega, če objekt vsebuje neobdelane kazalce.

Top