Anbefalt, 2022

Redaksjonens

Forskjellen mellom Copy Constructor og Assignment Operator i C ++

Kopier konstruktør og oppdrag operatør, er de to måtene å initialisere ett objekt ved hjelp av et annet objekt. Den grunnleggende forskjellen mellom kopikonstruktøren og oppdragsoperatøren er at kopikonstruktøren allokerer separat minne til begge objektene, det vil si det nyopprettede målobjektet og kildeobjektet. Oppdragsoperatøren tildeler samme minneplass til det nyopprettede målobjektet, så vel som kildeobjekt.

La oss studere forskjellen mellom kopikonstruktøren og oppdragsoperatøren.

Sammenligningstabel

Grunnlag for sammenligningKopier KonstruksjonOppdragsoperatør
grunn~~POS=TRUNCKopikonstruktøren er en overbelastet konstruktør.Oppdragsoperatøren er en bitvis operatør.
BetydningKopikontakten initierer det nye objektet med et eksisterende objekt.Oppdragsoperatøren tilordner verdien av ett objekt til et annet objekt som begge allerede eksisterer.
syntaxclass_name (cont class_name & object_name) {
/ / Konstruktørens kropp
}
klassenavn Ob1, Ob2;
Ob2 = OB1;
påkaller(1) Kopier konstruktør påberoper når en ny gjenstand initialiseres med eksisterende.
(2) Objektet passerte til en funksjon som en ikke-referanseparameter.
(3) Objektet returneres fra funksjonen.
Oppdragsoperatøren er kun påkalt når den eksisterende objektet tilordnes en ny gjenstand.
MinneallokeringBåde målobjektet og det initialiserende objektet deler de forskjellige minnesteder.Både målobjektet og det initialiserende objektet deler samme allokert minne.
MisligholdeHvis du ikke definerer noen kopi-konstruktør i programmet, gir C ++-kompilatoren implisitt en.Hvis du ikke overbelaster "=" operatøren, vil en bitvis kopi bli gjort.

Definisjon av kopimaskin

En "kopikonstruksjon" er en form for en overbelastet konstruktør . En kopi-konstruktør kalles eller påberopes bare for initialiseringsformål. En kopiekonstruksjon initialiserer det nyopprettede objektet med et annet eksisterende objekt. Når en kopi-konstruktør brukes til å initialisere det nyopprettede målobjektet, deler både målobjektet og kildeobjektet forskjellig minneplassering. Endringer som er gjort i kildeobjektet reflekterer ikke i målobjektet. Den generelle form for kopikonstruksjonen er

 class_ name (class_name & object_name) {. // kropp av kopi konstruktør. } // objektnavn refererer til objektet på høyre side av initialiseringen. 

Hvis programmereren ikke lager en kopiekonstruksjon i et C ++-program, gir kompilatoren implicit en kopikonstruksjon. En implisitt kopikonstruktor som leveres av kompilatoren gjør den medlemsbeviste kopien av kildeobjektet. Men noen ganger er den medlemsbise kopien ikke tilstrekkelig, da objektet kan inneholde en pekervariabel. Kopiering av en pekervariabel betyr at vi kopierer adressen som er lagret i pekervariabelen, men vi ønsker ikke å kopiere adressen som er lagret i pekervariabelen, i stedet vil vi kopiere hvilken pekepunkt til. Derfor er det behov for eksplisitt "kopi-konstruktør" i programmet for å løse denne typen problemer.

En kopikonstruktør påberopes i tre forhold som følger:

  • Kopier konstruktør påberoper når en ny gjenstand initialiseres med eksisterende.
  • Objektet passerte til en funksjon som en ikke-referanseparameter.
  • Objektet returneres fra funksjonen.

La oss forstå kopiekonstruktør med et eksempel.

 klasse kopi {int num; offentlig: kopi () {} // standard konstruktor kopi (int a) {// initialiserer constructor num = a; } kopi (kopi og c) {// Kopier konstruktør num = c.num; } tomt show () {cout << num; }}; int main () {copy A (200); // Objekt En opprettet og initialisert kopi B (A); // Kopier konstruktør kalt kopi C = A; // Kopier konstruktør kalt kopi D; D = A; // kopikonstruktør som ikke er kalt fordi objekt D ikke nylig opprettet objekt. // det er en oppgaveoperasjon. returner 0; } 

I koden ovenfor hadde jeg eksplisitt erklært en konstruktør "kopi (kopi og c)". Denne kopikonstruktøren blir kalt når objekt B initialiseres ved bruk av objekt A. Andre gang det kalles når objekt C blir initialisert ved bruk av objekt A. Når objekt D initialiseres ved bruk av objekt A, kalles ikke kopikonstruktøren fordi når D initialiseres Det er allerede i eksistensen, ikke den nyopprettede. Derfor er oppdragsoperatøren her påkalt.

Definisjon av oppdragsoperatør

Oppdragsoperatøren er en tilordnet operatør av C ++. Operatøren "=" brukes til å påkalle oppdragsoperatøren. Den kopierer dataene i ett objekt som er identisk med et annet objekt. Oppdragsoperatøren kopierer ett objekt til et annet medlemsmessig. Hvis du ikke overbelaster oppdragsoperatøren, utfører den bitvis kopien. Derfor må du overbelaste oppdragsoperatøren.

 klasse kopi {int num; offentlig: kopi () {} // standard konstruktor kopi (int a) {// initialiserer constructor num = a; } tomt show () {cout << num; }}; int main () {copy A (200); // Objekt A opprettet og initialisert kopi B (300); // Objekt B opprettet og initialisert B = A; // oppdrag operatør påkalt kopi C; C = A; // oppdragsoperatør påkalt retur 0; } 

I overkoden når objektA er tilordnet objekt B, blir oppdragsoperatøren påkalt da begge objektene allerede eksisterer. Tilsvarende er det tilfelle når objekt C initialiseres med objekt A.

Når bitvis oppgave utføres, deler objektet også samme minneplass og endringer i ett objekt reflekteres i en annen gjenstand.

Viktige forskjeller mellom kopikonstruksjon og oppdragsoperatør

  1. En kopikonstruktør er en overbelastet konturator hvor som en oppdragsoperatør er en bitvis operatør.
  2. Ved hjelp av kopikonstruksjon kan du initialisere et nytt objekt med et allerede eksisterende objekt. På den annen side kopierer en oppdragsoperatør ett objekt til det andre objektet, som begge allerede er i eksistens.
  3. En kopi construcor blir initialisert når en ny gjenstand initialiseres med et allerede eksisterende objekt, når en gjenstand sendes til en funksjon som en ikke-refrence parameter, eller når en gjenstand returneres fra en funksjon. På den annen side blir en oppdragsoperatør kun påkalt når en objekt blir tildelt til en annen gjenstand.
  4. Når en gjenstand initialiseres ved hjelp av kopikonstruksjon, deler initialiseringsobjektet og det initialiserte objektet den forskjellige minnestedelen. På den annen side, når et objekt blir initialisert ved hjelp av en oppdragsoperatør, deler de initierte og initialiserende objektene samme minneplassering.
  5. Hvis du ikke spesifikt definerer en kopi-konstruktør, gir kompilatoren en. På den annen side, hvis du ikke overbelaster en assigmentoperatør, utføres en bitvis kopiering.

Konklusjon:

Kopier-konstruktøren er best for å kopiere ett objekt til et annet når objektet inneholder rå pekere.

Top