Rekommenderas, 2024

Redaktionen

Skillnad mellan Copy Constructor och Assignment Operator i C ++

Kopiera konstruktör och uppdragsoperatör, är de två sätten att initiera ett objekt med ett annat objekt. Den grundläggande skillnaden mellan kopikonstruktören och uppdragsoperatören är att kopiekonstruktorn allokerar separat minne till både objekten, det vill säga det nyskapade målobjektet och källobjektet. Tilldelningsoperatören allokerar samma minnesplats till det nyskapade målobjektet såväl som källobjekt.

Låt oss studera skillnaden mellan kopikonstruktören och uppdragsoperatören.

Jämförelsediagram

Grunder för jämförelseKopiera konstruktornUppdragsoperatör
GrundläggandeKopikonstruktören är en överbelastad konstruktör.Uppdragsoperatören är bitvis operatör.
MenandeKopikonstruktören initierar det nya objektet med ett redan existerande objekt.Uppdragsoperatören tilldelar värdet av ett objekt till ett annat objekt som båda redan existerar.
Syntaxklassnamn (fortsätt klassnamn och objektnamn) {
// konstruktionens kropp
}
klassnamn Ob1, Ob2;
OB2 = OB1;
åberopar(1) Kopikonstruktör påstår när ett nytt objekt initieras med befintlig.
(2) Objektet passerade till en funktion som en icke-referensparameter.
(3) Objektet returneras från funktionen.
Uppdragsoperatören anropas endast när det befintliga objektet tilldelas ett nytt objekt.
MinnesallokeringBåde målobjektet och det initialiserande objektet delar de olika minnesplatserna.Både målobjektet och det initialiserande objektet delar samma tilldelade minne.
StandardOm du inte definierar någon kopiekonstruktör i programmet, ger C ++-kompilatorn implicit en.Om du inte överbelastar operatören "=", kommer en bitvis kopia att göras.

Definition av Copy Constructor

En "kopiekonstruktor" är en form av en överbelastad konstruktör . En kopikonstruktör kallas eller påminns endast för initialiseringsändamål. En kopikonstruktör initierar det nyskapade objektet med ett annat befintligt objekt. När en kopiekonstruktör används för att initiera det nyskapade målobjektet, delar både målobjektet och källobjektet olika minnesplats. Ändringar som gjorts till källobjektet speglar inte i målobjektet. Den generella formen av kopiekonstruktorn är

 class_ name (class_name & object_name) {. // kopia av konstruktör } // objektnamn avser objektet på höger sida av initialiseringen. 

Om programmeraren inte skapar en kopiekonstruktor i ett C ++-program, tillhandahåller kompilatorn implicit en kopiekonstruktor. En implicit kopikonstruktör som tillhandahålls av kompilatorn gör den medlemsklara kopian av källobjektet. Men ibland är den medlemsklara kopian inte tillräcklig, eftersom objektet kan innehålla en pekervariabel. Kopiera en pekarvariabel betyder att vi kopierar adressen som lagrats i pekervariabeln, men vi vill inte kopiera adressen som lagrats i pekervariabeln, istället vill vi kopiera vilken pekare som ska peka på. Därför finns det ett behov av explicit "copy constructor" i programmet för att lösa denna typ av problem.

En kopikonstruktör åberopas i tre villkor enligt följande:

  • Kopiera konstruktören påstår när ett nytt objekt initieras med befintlig.
  • Objektet passerade till en funktion som en icke-referensparameter.
  • Objektet returneras från funktionen.

Låt oss förstå kopikonstruktorn med ett exempel.

 klass kopia {int num; public: copy () {} // default constructor copy (int a) {// initialiserar konstruktorn num = a; } kopiera (kopiera och c) {// Kopiera konstruktornummer = c.num; } tomrumsvisning () {cout << num; }}; int huvud () {kopia A (200); // Objekt A skapad och initialiserad kopia B (A); // Kopiera konstruktorn kallad kopia C = A; // Kopiera konstruktorn kallad kopia D; D = A; // kopikonstruktör som inte heter eftersom objekt D inte nyskapat objekt. // Det är en uppdragsoperation. returnera 0; } 

I koden ovan hade jag uttryckligen förklarat en konstruktör "kopia (copy & c)". Denna kopiekonstruktor kallas när objekt B initieras med användning av objekt A. Andra gången heter det när objekt C initieras med användning av objekt A. När objekt D initieras med användning av A, kallas inte kopikonstruktorn för att när D initialiseras Det är redan i förekomsten, inte den nyskapade. Därför åberopas uppdragsoperatören.

Definition av uppdragsoperatör

Uppdragsoperatören är en tilldelande operatör av C ++. Operatören "=" används för att åberopa uppdragsoperatören. Den kopierar data i ett objekt identiskt med ett annat objekt. Uppdragsoperatören kopierar ett objekt till en annan medlemsläge. Om du inte överbelastar uppdragsoperatören utför den bitvis kopian. Därför måste du överbelasta uppdragsoperatören.

 klass kopia {int num; public: copy () {} // default constructor copy (int a) {// initialiserar konstruktorn num = a; } tomrumsvisning () {cout << num; }}; int huvud () {kopia A (200); // Objekt A skapad och initialiserad kopia B (300); // Objekt B skapat och initialiserat B = A; // uppdragsoperatör åberopat kopia C; C = A; // uppdragsoperatör påkallad retur 0; } 

I ovanstående kod när objektA är tilldelat objekt B kallas uppdragsoperatören som båda föremålen existerar redan. På samma sätt är samma sak när objekt C initieras med objekt A.

När bitvis uppdelning utförs båda delar objektet samma minnesplats och ändringar i ett objekt reflekteras i ett annat objekt.

Viktiga skillnader mellan kopieringskonstruktion och uppdragsoperatör

  1. En kopikonstruktör är en överbelastad konturator där som uppdragsoperatör är en bitvis operatör.
  2. Med hjälp av kopikonstruktorn kan du initiera ett nytt objekt med ett redan befintligt objekt. Å andra sidan kopierar en uppdragsoperatör ett objekt till det andra objektet, som båda redan existerar.
  3. En kopiekonstruktion initieras när ett nytt objekt initieras med ett redan befintligt objekt, när ett objekt skickas till en funktion som en icke-refrensparameter, eller när ett objekt returneras från en funktion. Å andra sidan åberopas en uppdragsoperatör endast när ett objekt tilldelas ett annat objekt.
  4. När ett objekt initieras med hjälp av koparkonstruktorn delar det initialiserande objektet och det initialiserade objektet den olika minnesplatsen. Å andra sidan, när ett objekt initieras med en uppdragsoperatör delar de initialiserade och initialiserande objekten samma minnesplats.
  5. Om du inte explicit definierar en kopiekonstruktor, tillhandahåller kompilatorn en. Å andra sidan, om du inte överbelastar en assigmentoperatör, utförs en bitvis kopiering.

Slutsats:

Copy-konstruktorn är bäst för att kopiera ett objekt till ett annat när objektet innehåller råa pekare.

Top