Anbefalet, 2024

Redaktørens Valg

Forskel mellem Copy Constructor og Assignment Operator i C ++

Kopier konstruktør og opgave operatør, er de to måder at initialisere en objekt ved hjælp af et andet objekt. Den grundlæggende forskel mellem kopikonstruktøren og opgaveoperatøren er, at kopikonstruktøren allokerer separat hukommelse til både objekterne, det vil sige det nyoprettede målobjekt og kildeobjektet. Tildelingsoperatøren tildeler samme hukommelsessted til det nyoprettede målobjekt såvel som kildeobjekt.

Lad os studere forskellen mellem kopikonstruktør og opgaveoperatør.

Sammenligningstabel

Grundlag for sammenligningKopier KonstruktørOpgaveoperatør
GrundlæggendeKopikonstruktøren er en overbelastet konstruktør.Tildelingsoperatøren er en bitvis operatør.
BetyderKopikonstruktøren initialiserer det nye objekt med et allerede eksisterende objekt.Tildelingsoperatøren tildeler værdien af ​​en objekt til et andet objekt, som begge allerede eksisterer.
Syntaksclass_name (cont class_name & object_name) {
// Konstruktørens krop
}
klassenavn Ob1, Ob2;
OB2 = OB1;
Starter(1) Kopier konstruktør påberåber, når en ny genstand initialiseres med den eksisterende.
(2) Objektet passerede til en funktion som en ikke-referenceparameter.
(3) Objektet returneres fra funktionen.
Tildelingsoperatøren påberåbes kun, når den eksisterende objekt tildeles en ny objekt.
Memory AllocationBåde målobjektet og det initialiserende objekt deler de forskellige hukommelsessteder.Både målobjektet og det initialiserende objekt deler samme tildelte hukommelse.
StandardHvis du ikke definerer nogen kopiekonstruktør i programmet, giver C ++ compiler implicit en.Hvis du ikke overbelaster "=" operatøren, bliver der lavet en bitvis kopi.

Definition af Copy Constructor

En "kopikonstruktion" er en form for en overbelastet konstruktør . En kopikonstruktør kaldes eller påberåbes kun til initialiseringsformål. En kopikonstruktør initialiserer det nyoprettede objekt med en anden eksisterende genstand. Når en kopikonstruktør bruges til at initialisere det nyoprettede målobjekt, deler både målobjektet og kildeobjektet en anden hukommelsesplacering. Ændringer udført til kildeobjektet afspejler ikke i målobjektet. Den generelle form af kopikonstruktøren er

 klasse_ navn (klassenavn og objektnavn) {. // kopi af konstruktør. } // objektnavn henviser til objektet på højre side af initialiseringen. 

Hvis programmereren ikke opretter en kopiekonstruktor i et C ++-program, giver kompilatoren implicit en kopiekonstruktor. En implicit kopikonstruktør, der leveres af kompilatoren, gør den medlemskendte kopi af kildeobjektet. Men undertiden er den medlemsklage kopi ikke tilstrækkelig, da objektet kan indeholde en pointervariabel. Kopiering af en pointervariabel betyder, at vi kopierer den adresse, der er gemt i pegervariablen, men vi ønsker ikke at kopiere den adresse, der er gemt i markørvariablen, men i stedet ønsker vi at kopiere hvilke pegepunkter til. Derfor er der et behov for eksplicit 'copy constructor' i programmet for at løse denne form for problemer.

En kopikonstruktør påberåbes i tre betingelser som følger:

  • Kopier konstruktør påberåber, når en ny genstand initialiseres med den eksisterende.
  • Objektet passerede til en funktion som en ikke-reference parameter.
  • Objektet returneres fra funktionen.

Lad os forstå kopikonstruktør med et eksempel.

 klasse kopi {int num; offentligt: ​​kopi () {} // standard konstruktor kopi (int a) {// initialisering constructor num = a; } kopi (kopi og c) {// Kopier konstruktor num = c.num; } tomrumsvisning () {cout << num; }}; int main () {copy A (200); // Objekt A oprettet og initialiseret kopi B (A); // Kopier konstruktør kaldet kopi C = A; // Kopier konstruktør kaldet kopi D; D = A; // kopikonstruktør ikke kaldt fordi objekt D ikke nyoprettede objekt. // det er en opgaveoperation. returnere 0; } 

I koden ovenfor havde jeg udtrykkeligt erklæret en konstruktør "copy (copy & c)". Denne kopikonstruktør bliver kaldt, når objekt B initialiseres ved anvendelse af objekt A. Anden gang bliver det kaldt, når objekt C initialiseres ved anvendelse af objekt A. Når objekt D initialiseres ved hjælp af objekt A, kaldes kopikonstruktøren ikke, fordi når D initialiseres det er allerede i eksistensen, ikke den nyoprettede. Derfor pålægges opgaveoperatøren her.

Definition af opgaveoperatør

Tildelingsoperatøren er en tilordnet operatør af C ++. Operatøren "=" er brugt til at påkalde tildelingsoperatøren. Den kopierer dataene i et objekt identisk med et andet objekt. Tildelingsoperatøren kopierer ét objekt til et andet medlemskab. Hvis du ikke overbelaster tildelingsoperatøren, udfører den bitvis kopi. Derfor skal du overbelaste tildelingsoperatøren.

 klasse kopi {int num; offentligt: ​​kopi () {} // standard konstruktor kopi (int a) {// initialisering constructor num = a; } tomrumsvisning () {cout << num; }}; int main () {copy A (200); // Objekt A Opret og initialiseret kopi B (300); // Objekt B oprettet og initialiseret B = A; // opgaveoperatør påberåbt kopi C; C = A; // opgaveoperatør påkaldt retur 0; } 

I ovenstående kode, når objektA er tildelt objekt B, bliver tildelingsoperatøren påkaldt, da begge objekter allerede eksisterer. Tilsvarende er det tilfældet, når objekt C initialiseres med objekt A.

Når bitvis tildeling udføres, deler objektet samme hukommelsessted og ændringer i et objekt reflekteres i et andet objekt.

Nøgleforskelle mellem Copy Constructor og Assignment Operator

  1. En kopikonstruktør er en overbelastet kontruktor, hvor som en assignment operatør er en bitvis operatør.
  2. Ved hjælp af kopikonstruktion kan du initialisere et nyt objekt med et allerede eksisterende objekt. På den anden side kopierer en opgaveoperatør et objekt til det andet objekt, der begge allerede er i eksistens.
  3. En kopiekonstruktion initialiseres, når en ny objekt initialiseres med et allerede eksisterende objekt, når en objekt overføres til en funktion som en ikke-refrence-parameter, eller når en objekt returneres fra en funktion. På den anden side er en opgaveoperatør kun påkaldt, når en objekt bliver tildelt til en anden objekt.
  4. Når en genstand initialiseres ved hjælp af kopikonstruktion, deler initialiseringsobjektet og det initialiserede objekt den forskellige hukommelsesplacering. På den anden side deler en initialiseret og initialiserende genstand samme hukommelsessted, når en genstand initialiseres ved hjælp af en assignment operator.
  5. Hvis du ikke udtrykkeligt definerer en kopikonstruktør, giver kompilatoren en. På den anden side, hvis du ikke overbelaster en assigment operatør, udføres en bitwise kopiering.

Konklusion:

Copy-konstruktøren er bedst til at kopiere en objekt til en anden, når objektet indeholder råpegepinde.

Top