Ištirsime skirtumą tarp kopijavimo konstruktoriaus ir priskyrimo operatoriaus.
Palyginimo diagrama
Palyginimo pagrindas | Kopijavimo konstruktorius | Priskyrimo operatorius |
---|---|---|
Pagrindinis | Kopijavimo konstruktorius yra perkrautas konstruktorius. | Priskyrimo operatorius yra bitinis operatorius. |
Reikšmė | Kopijavimo konstruktorius inicijuoja naują objektą jau esančiu objektu. | Priskyrimo operatorius vieno objekto vertę priskiria kitam objektui, kuris jau yra egzistuojantis. |
Sintaksė | klasės_pavadinimas (cont class_name & object_name) { // konstruktoriaus kūnas } | klasės pavadinimas Ob1, Ob2; Ob2 = Ob1; |
Pradeda | (1) Kopijavimo konstruktorius skatina, kai naujasis objektas inicijuojamas esamu. (2) Objektas perduodamas funkcijai kaip nepagrindinis parametras. (3) Objektas grąžinamas iš funkcijos. | Priskyrimo operatorius kviečiamas tik priskiriant esamą objektą naujam objektui. |
Atminties paskirstymas | Tiek tikslinis objektas, tiek pradinis objektas dalijasi skirtingomis atminties vietomis. | Tiek tikslinis objektas, tiek inicijuojantis objektas dalijasi ta pačia paskirta atmintimi. |
Numatytas | Jei programoje nenustatote jokio kopijavimo konstruktoriaus, C ++ kompiliatorius numato netiesiogiai. | Jei perkraunate operatorių „=“, bus atlikta bitų kopija. |
Kopijavimo konstruktoriaus apibrėžimas
„Kopijavimo konstruktorius“ yra perkrautos konstruktoriaus forma. Kopijavimo konstruktorius skambinamas arba naudojamas tik inicijavimo tikslu. Kopijavimo konstruktorius naujai sukurtą objektą inicijuoja kito esamo objekto. Kai kopijavimo konstruktorius naudojamas naujai sukurtam tiksliniam objektui inicijuoti, tada tikslo objektas ir šaltinio objektas turi skirtingą atminties vietą. Šaltinio objekto pakeitimai neatspindi tikslinio objekto. Bendra kopijos konstruktoriaus forma yra
klasės_pavadinimas (klasės_pavadinimas ir objekto pavadinimas) {. // kopijavimo konstruktoriaus įstaiga. } // objektų_pavadinimas nurodo objektą, esantį dešinėje inicializacijos pusėje.
Jei programuotojas C ++ programoje nesukuria kopijavimo konstruktoriaus, kompiliatorius netiesiogiai pateikia kopijavimo konstruktorių. Kompiliatoriaus pateiktas netiesioginio kopijavimo konstruktorius atlieka šaltinio objekto kopiją. Tačiau kartais nepakanka nario-kopijavimo, nes objekte gali būti rodyklės kintamasis. Kopijuojant rodyklės kintamąsias priemones, nukopijuojame rodyklės kintamajame saugomą adresą, bet nenorime kopijuoti adreso, saugomo rodyklės kintamajame, o mes norime nukopijuoti, kas rodomas. Taigi, norint išspręsti tokias problemas, programoje būtinas aiškus „kopijavimo konstruktorius“.
Kopijavimo konstruktorius remiamasi trimis sąlygomis:
- Kopijavimo konstruktorius pradeda naudoti, kai naujasis objektas inicijuojamas esamu.
- Objektas perkeliamas į funkciją kaip nenurodomasis parametras.
- Objektas grąžinamas iš funkcijos.
Suprasime kopijos konstruktorių su pavyzdžiu.
klasės kopija {int num; public: copy () {} // numatytoji konstruktoriaus kopija (int a) {// iniciatoriaus num = a; } kopija (kopija & c) {// Kopijuoti konstruktorių num = c.num; } void show () {cout << num; }}; int main () {A kopija (200); // Objektas Sukurta ir inicijuota B (A) kopija; // Kopijavimo konstruktorius, vadinamas kopija C = A; // Kopijuoti konstruktorius, vadinamas kopija D; D = A; / / kopija konstruktorius nėra vadinamas, nes objektas D nėra naujai sukurtas objektas. // tai priskyrimo operacija. grąža 0; }
Minėtame kode aš aiškiai paskelbiau konstruktorių „kopiją (kopiją ir c)“. Šis kopijavimo konstruktorius kviečiamas, kai objektas B yra inicijuojamas naudojant A objektą. Antras kartas, kai objektas C yra inicijuojamas naudojant objektą C. Kai objektas D inicijuojamas naudojant objektą A, kopijavimo konstruktorius nėra vadinamas, nes kai D yra inicijuojamas tai jau egzistuoja, o ne naujai sukurta. Taigi, čia paskiriamas priskyrimo operatorius.
Priskyrimo operatoriaus apibrėžimas
Priskyrimo operatorius yra C ++ operatorius. Operatorius „=“ naudojamas paskirti priskyrimo operatorių. Jis kopijuoja duomenis viename objekte identiškai į kitą objektą. Priskyrimo operatorius vieną objektą nukopijuoja į kitą narį. Jei perkraunate priskyrimo operatorių, jis atlieka bitų kopiją. Todėl reikia perkrauti priskyrimo operatorių.
klasės kopija {int num; public: copy () {} // numatytoji konstruktoriaus kopija (int a) {// iniciatoriaus num = a; } void show () {cout << num; }}; int main () {A kopija (200); // Objektas Sukurta ir inicijuota B kopija (300); // Objektas B sukurtas ir inicijuotas B = A; // priskyrimo operatorius kreipėsi į C egzempliorių; C = A; // priskyrimo operatorius, kuriam grįžta 0; }
Viršutiniame kode, kai objektui B priskiriamas objektas B, priskyrimo operatorius yra kviečiamas, nes abu objektai jau yra. Panašiai tas pats atvejis, kai objektas C yra inicijuojamas su objektu A.
Kai bitų priskyrimas atliekamas, objektas dalijasi ta pačia atminties vieta, o vieno objekto pokyčiai atspindi kitą objektą.
Pagrindiniai skirtumai tarp kopijavimo konstruktoriaus ir priskyrimo operatoriaus
- Kopijavimo konstruktorius yra perkrautas kontaktorius, kur kaip priskyrimo operatorius yra bitinis operatorius.
- Naudojant kopijavimo konstruktorių, galite inicijuoti naują objektą jau esančiu objektu. Kita vertus, priskyrimo operatorius vieną objektą nukopijuoja į kitą objektą, kurie abu jau egzistuoja.
- Kopijavimo konstruktorius inicijuojamas, kai naujas objektas inicijuojamas jau esamu objektu, kai objektas perduodamas funkcijai kaip ne refrencinis parametras, arba kai objektas grąžinamas iš funkcijos. Kita vertus, priskyrimo operatorius kviečiamas tik tada, kai objektas priskiriamas kitam objektui.
- Kai objektas inicijuojamas naudojant kopijavimo konstruktorių, inicijuotas objektas ir inicijuotas objektas dalijasi skirtinga atminties vieta. Kita vertus, kai objektas inicijuojamas naudojant priskyrimo operatorių, inicijuoti ir inicijuoti objektai turi tą pačią atminties vietą.
- Jei aiškiai nenurodote kopijos konstruktoriaus, kompiliatorius pateikia vieną. Kita vertus, jei neperkraunate priskyrimo operatoriaus, atliekama bitų kopijavimo operacija.
Išvada:
Kopijavimo konstruktorius geriausiai tinka vieno objekto kopijavimui į kitą, kai objekte yra neapdorotų nuorodų.