Preporučeno, 2022

Izbor Urednika

Razlika između konstruktora kopiranja i operatora dodjele u C ++

Kopiraj konstruktor i operator zadatka, dva su načina za inicijalizaciju jednog objekta pomoću drugog objekta. Temeljna razlika između konstruktora kopiranja i operatora dodjele je da konstruktor kopiranja dodjeljuje zasebnu memoriju objema objektima, tj. Novo stvorenom ciljnom objektu i izvornom objektu. Operator dodjele dodjeljuje istu memorijsku lokaciju novonastalom ciljnom objektu kao i izvorni objekt.

Proučimo razliku između konstruktora kopiranja i operatora dodjele.

Tablica usporedbe

Osnova za usporedbuKopiraj konstruktorOperator dodjele
Osnovni, temeljniKonstruktor kopiranja je preopterećen konstruktor.Operator dodjele je bitni operator.
ZnačenjeKonstruktor kopiranja inicira novi objekt s već postojećim objektom.Operator dodjele dodjeljuje vrijednost jednog objekta drugom objektu koji već postoji.
Sintaksaime_klasa (cont class_name & object_name) {
// tijelo konstruktora
}
class_name Ob1, Ob2;
Ob2 = OB1;
poziva(1) Kopiraj konstruktor poziva kada se novi objekt inicijalizira s postojećim.
(2) Objekt je proslijeđen funkciji kao nereferentni parametar.
(3) Objekt se vraća iz funkcije.
Operator dodjeljivanja se poziva samo kada se postojećem objektu dodijeli novi objekt.
Dodjela memorijeI ciljni objekt i objekt inicijalizacije dijele različite memorijske lokacije.I ciljni objekt i objekt inicijalizacije dijele istu dodijeljenu memoriju.
ZadanoAko ne definirate bilo koji konstruktor kopiranja u programu, C ++ prevoditelj implicitno nudi jedan.Ako ne preopterete operator "=", bit će napravljena bitna kopija.

Definicija konstruktora kopiranja

"Konstruktor kopiranja" je oblik preopterećenog konstruktora . Konstruktor kopiranja je pozvan ili pozvan samo za svrhu inicijalizacije. Konstruktor kopiranja inicira novo stvoreni objekt pomoću drugog postojećeg objekta. Kada se konstruktor kopiranja koristi za inicijalizaciju novo stvorenog ciljnog objekta, tada i ciljni objekt i izvorni objekt dijele različitu memorijsku lokaciju. Promjene učinjene na izvornom objektu ne odražavaju se u ciljnom objektu. Opći je oblik konstruktora kopiranja

 ime klase (naziv klase i naziv objekta) {. // tijelo konstruktora kopiranja. } // object_name se odnosi na objekt na desnoj strani inicijalizacije. 

Ako programer ne kreira konstruktor kopiranja u C ++ programu, kompajler implicitno osigurava konstrukt kopiranja. Implicitni konstruktor kopiranja koji daje prevodilac vrši kopiju izvornog objekta člana. No, ponekad kopija po članu nije dovoljna, jer objekt može sadržavati varijablu pokazivača. Kopirajući varijablu pokazivača, kopiramo adresu pohranjenu u pokazivačkoj varijabli, ali ne želimo kopirati adresu pohranjenu u pokazivačkoj varijabli, umjesto toga želimo kopirati na što je pokazivač usmjeren. Stoga postoji potreba za eksplicitnim 'konstruktom kopiranja' u programu za rješavanje takvih problema.

Konstruktor kopiranja se poziva u tri uvjeta kao što slijedi:

  • Kopiraj konstruktor poziva se kada se novi objekt inicijalizira s postojećim.
  • Objekt je proslijeđen funkciji kao nereferentni parametar.
  • Objekt se vraća iz funkcije.

Razmotrimo primjer konstruktora kopiranja.

 kopija razreda {int num; public: copy () {} // default konstruktor copy (int a) {// inicirajući konstruktor num = a; } copy (copy & c) {// Kopiraj konstruktor num = c.num; } void show () {cout << num; }}; int main () {kopija A (200); // Objekt A kreirana i inicijalizirana kopija B (A); // Kopiraj konstruktor nazvan kopija C = A; // Kopiraj konstruktor nazvan kopija D; D = A; // Kopiraj konstruktor ne zove jer objekt D nije novostvoreni objekt. // to je operacija dodjele. return 0; } 

U gore navedenom kodu eksplicitno sam deklarirao konstruktora "copy (copy & c)". Ovaj se konstruktor kopiranja poziva kada se objekt B inicijalizira pomoću objekta A. Drugi put kada se pozove kada se objekt C inicijalizira pomoću objekta A. Kada je objekt D inicijaliziran pomoću objekta A, konstruktor kopiranja se ne poziva zato što se D inicijalizira ona je već u postojanju, a ne u novostvorenoj. Dakle, ovdje se poziva operator za dodjelu.

Definicija operatora dodjele

Operator dodjeljivanja je operator koji dodjeljuje C ++. Operator "=" koristi se za pozivanje operatora dodjele. Kopira podatke u jedan objekt identično drugom objektu. Operator dodjele kopira jedan objekt drugom članu. Ako ne preopterete operatora dodjele, on izvodi kopiju bitova. Stoga, morate preopteretiti operatora dodjele.

 kopija razreda {int num; public: copy () {} // default konstruktor copy (int a) {// inicirajući konstruktor num = a; } void show () {cout << num; }}; int main () {kopija A (200); // Objekt A kreirana i inicijalizirana kopija B (300); // Objekt B kreiran i inicijaliziran B = A; // operater dodjeljivanja pozvan kopija C; C = A; // operater dodjeljivanja pozvan povrat 0; } 

U gore navedenom kodu, kada je objekt A dodijeljen objektu B, poziva se operator operacije dodjeljivanja jer oba objekta već postoje. Slično tome, isti je slučaj kada je objekt C inicijaliziran s objektom A.

Kada se izvršava bitova dodjela, objekt dijeli istu memorijsku lokaciju i promjene u jednom objektu odražavaju se u drugom objektu.

Ključne razlike između konstruktora kopiranja i operatora dodjele

  1. Konstruktor kopiranja je preopterećeni konstruktor gdje je kao operator dodjeljivanja bitni operator.
  2. Pomoću konstruktora kopiranja možete inicijalizirati novi objekt s već postojećim objektom. S druge strane, operator dodjeljivanja kopira jedan objekt na drugi objekt, koji već postoji.
  3. Konstrukcija kopiranja inicijalizira se kad god se novi objekt inicijalizira već postojećim objektom, kada se objekt prosljeđuje funkciji kao parametar bez refrenca, ili kada se objekt vraća iz funkcije. S druge strane, operator dodjeljivanja se poziva samo kada se objekt dodijeli drugom objektu.
  4. Kada se objekt inicijalizira pomoću konstruktora kopiranja, objekt inicijalizacije i inicijalizirani objekt dijele različitu memorijsku lokaciju. S druge strane, kada se objekt inicijalizira pomoću operatora dodjele, inicijalizirani i inicijalizirajući objekti dijele istu memorijsku lokaciju.
  5. Ako ne izričito definirate konstruktor kopiranja, kompajler ga nudi. S druge strane, ako ne preopteretite operatora assigmenta tada se izvodi bitna operacija kopiranja.

Zaključak:

Konstruktor Kopiraj je najbolji za kopiranje jednog objekta na drugi kada objekt sadrži sirove pokazivače.

Top