Uurime erinevust koopiate konstruktori ja loovutamise operaatori vahel.
Võrdluskaart
Võrdluse alus | Kopeeri konstruktor | Ülesande operaator |
---|---|---|
Põhiline | Koopiate konstruktor on ülekoormatud konstruktor. | Ülesande operaator on bituentne operaator. |
Tähendus | Koopia konstruktor alustab uue objekti juba olemasoleva objektiga. | Ülesande operaator määrab ühe objekti väärtuse teisele objektile, mis mõlemad on juba olemas. |
Süntaksi | klassi_nimi (jätkuklassi_nimi ja objekti_nimi) { // ehitaja keha } | klassi_nimi Ob1, Ob2; Ob2 = Ob1; |
Käivitab | (1) Kopeerimise konstruktor kutsub üles, kui uus objekt alustatakse olemasoleva objektiga. (2) Objekt edastati funktsioonile mitte-võrdlusparameetrina. (3) Objekt tagastatakse funktsioonist. | Ülesande operaatorit kasutatakse ainult olemasoleva objekti määramisel uuele objektile. |
Mälu eraldamine | Nii sihtobjekt kui ka lähtestatav objekt jagavad erinevaid mälukohtasid. | Nii sihtobjekt kui ka lähtestatav objekt jagavad sama eraldatud mälu. |
Vaikimisi | Kui te ei määra programmis mingit koopiate konstruktorit, annab C ++ kompilaator kaudselt ühe. | Kui te ei ületa "=" operaatorit, siis tehakse bittide koopia. |
Kopeerimiskonstruktori määratlus
“Koopiamasin konstruktor” on ülekoormatud konstruktori vorm. Kopeerimise konstruktorit kutsutakse või käivitatakse ainult lähtestamise eesmärgil. Koopia konstruktor vormindab äsja loodud objekti teise olemasoleva objekti abil. Kui koopiate konstruktorit kasutatakse äsja loodud sihtobjekti vormindamiseks, jagavad nii sihtobjekt kui ka allikasobjekt erinevat mälu asukohta. Algobjektis tehtud muudatused ei peegelda sihtobjektis. Koopia konstruktori üldine vorm on
klassi_nimi (klassi_nimi ja objekti_nimi) {. // koopiaehitaja keha. } // objekti_nimi viitab objektile initsialiseerimise paremal küljel.
Kui programmeerija ei loo C ++ programmis koopiate konstruktorit, pakub kompilaator kaudselt koopiate konstruktorit. Koostaja poolt pakutav kaudne koopiate konstruktor teeb lähtobjekti liikme-eksemplari. Kuid mõnikord ei ole liige-tark kopeerimine piisav, kuna objekt võib sisaldada kursorit. Kursori muutujaid kopeerides kopeerime kursorimuutujaga salvestatud aadressi, kuid me ei taha kopeerida kursoritegurisse salvestatud aadressi, vaid tahame kopeerida, mis osutaja osutab. Sellest tulenevalt on programmis vaja selliseid probleeme lahendada selgesõnaliselt "koopiate tegija".
Koopiamasina konstruktorit kasutatakse järgmistel tingimustel:
- Kopeerimise konstruktor kutsub üles, kui uus objekt alustatakse olemasoleva objektiga.
- Objekt edastati funktsioonile mitte-võrdlusparameetrina.
- Objekt tagastatakse funktsioonist.
Mõelgem näiteks koopia konstruktorist.
klassi koopia {int num; avalik: koopia () {} // vaikimisi konstruktori koopia (int a) {// algoritme konstruktori num = a; } koopia (koopia & c) {// Kopeeri konstruktori num = c.num; } void show () {cout << num; }}; int main () {koopia A (200); // Objekt Loodud ja vormindatud koopia B (A); // Kopeeri konstruktor, mida nimetatakse koopia C = A; // koopiaehitaja kopeeri D; D = A; // kopeerimiskonstruktorit ei kutsutud, sest objekt D ei ole uus objekt. // see on loovutamistoiming. tagastamine 0; }
Ülaltoodud koodis olin selgesõnaliselt välja öelnud ehitaja „koopia (koopia ja c)”. Seda koopiate konstruktorit kutsutakse, kui objekt B vormindatakse objekti A. abil. Teist korda nimetatakse seda objektile C lähtestamisel objekti A abil. Kui objekt D vormindatakse objekti A abil, siis kopeerimiskonstruktorit ei kutsuta, sest kui D initsialiseeritakse see on juba olemas, mitte äsja loodud. Seega kutsutakse siin ülesande operaator.
Ülesande käitaja määratlus
Ülesande operaator on C + + määramise operaator. „=” Operaatorit kasutatakse ülesande operaatori kutsumiseks. See kopeerib andmed ühes objektis samamoodi teise objektiga. Ülesande operaator kopeerib ühe objekti teisele liikmele. Kui te ei määra ülesande operaatorit, täidab see bitipildi. Seetõttu peate ülesande operaatori ülekoormama.
klassi koopia {int num; avalik: koopia () {} // vaikimisi konstruktori koopia (int a) {// algoritme konstruktori num = a; } void show () {cout << num; }}; int main () {koopia A (200); // Objekt A loodud ja initsialiseeritud koopia B (300); // Objekt B on loodud ja vormindatud B = A; // loovutamise operaator kasutas koopiat C; C = A; // loovutamise operaator kutsus tagasi 0; }
Ülaltoodud koodis, kui objektile B on määratud objektA, kutsutakse ülesande operaatorit, kuna mõlemad objektid on juba olemas. Sama kehtib ka juhul, kui objekt C algab objektiga A.
Kui bittide määramine teostatakse, siis nii objektil on samasugune mälukoht ja ühe objekti muutused peegelduvad teises objektis.
Kopeerimiskonstruktori ja loovutamise operaatori peamised erinevused
- Koopia konstruktor on ülekoormatud kontaktor, kus loovutamise operaatorina on bituentne operaator.
- Koopiate konstruktori abil saate uue objekti juba olemasoleva objektiga vormindada. Teisest küljest kopeerib operaator ühe objekti teisele objektile, mis mõlemad on juba olemas.
- Koopia konstruktor lähtestatakse alati, kui uus objekt on juba olemasoleva objektiga initsialiseeritud, kui objekt edastatakse funktsioonile mitte-refrence parameetrina või kui objekt tagastatakse funktsioonist. Teisest küljest kutsutakse loovutamise operaator ainult siis, kui objekt on määratud teisele objektile.
- Kui objekt on vormindatud koopiate konstruktoriga, jagab lähtestav objekt ja vormindatud objekt erinevat mälu asukohta. Teisest küljest, kui objekt alustatakse loovutamise operaatoriga, jagavad vormindatud ja initsialiseeritavad objektid sama mälu asukohta.
- Kui te ei määratle koopiate konstruktorit selgesõnaliselt, siis annab kompilaator ühe. Teisest küljest, kui te ei kasuta assigmentioperaatorit ülekoormatud, siis teostatakse bituentne kopeerimine.
Järeldus:
Kopeerimiskonstruktor sobib kõige paremini ühe objekti kopeerimiseks teisele, kui objekt sisaldab toorikuid.