Laten we het verschil tussen de copy-constructor en de toewijzingsoperator bestuderen.
Vergelijkingstabel
Basis voor vergelijking | Kopieer Constructor | Toewijzingsexploitant |
---|---|---|
basis- | De kopie-constructor is een overbelaste constructor. | De toewijzingsoperator is een bitsgewijze operator. |
Betekenis | De kopie-constructor initialiseert het nieuwe object met een reeds bestaand object. | De toewijzingsoperator wijst de waarde van een object toe aan een ander object dat beide al bestaan. |
Syntaxis | class_name (cont class_name & object_name) { // body van de constructor } | class_name Ob1, Ob2; OB2 = Ob1; |
Roept | (1) Constructor kopiëren wordt opgeroepen wanneer een nieuw object met een bestaande wordt geïnitialiseerd. (2) Het object doorgegeven aan een functie als een niet-referentieparameter. (3) Het object wordt geretourneerd uit de functie. | De toewijzingsoperator wordt alleen aangeroepen wanneer het bestaande object een nieuw object wordt toegewezen. |
Geheugentoewijzing | Zowel het doelobject als het initialiseringsobject deelt de verschillende geheugenlocaties. | Zowel het doelobject als het initialiserende object delen hetzelfde toegewezen geheugen. |
Standaard | Als u in het programma geen copy-constructor definieert, levert de C ++ -compiler impliciet een op. | Als u de operator "=" niet overbelast, wordt er een bitsgewijze kopie gemaakt. |
Definitie van Copy Constructor
Een "copy constructor" is een vorm van een overbelaste constructor . Een exemplaarconstructor wordt alleen aangeroepen of aangeroepen voor initialisatiedoeleinden. Een kopie-constructor initialiseert het nieuw gemaakte object door een ander bestaand object. Wanneer een kopie-constructor wordt gebruikt om het zojuist gemaakte doelobject te initialiseren, delen zowel het doelobject als het bronobject verschillende geheugenlocaties. Wijzigingen in het bronobject worden niet weerspiegeld in het doelobject. De algemene vorm van de kopie-constructor is
class_ name (class_name & object_name) {. // body of copy constructor. } // objectnaam verwijst naar het object aan de rechterkant van de initialisatie.
Als de programmeur geen kopie-constructor maakt in een C ++ -programma, levert de compiler impliciet een kopieconstructor. Een impliciete exemplaarconstructor die wordt geleverd door de compiler, maakt de lidgewijze kopie van het bronobject. Maar soms is de lidgewijze kopie niet voldoende, omdat het object een pointervariabele kan bevatten. Het kopiëren van een pointer variabele betekent dat we het adres kopiëren dat is opgeslagen in de pointer variabele, maar we willen geen adres kopiëren dat is opgeslagen in de pointer variabele, in plaats daarvan willen we kopiëren naar welke pointerpunten. Daarom is er een behoefte aan een expliciete 'copy constructor' in het programma om dit soort problemen op te lossen.
Een kopie-constructor wordt aangeroepen in drie voorwaarden als volgt:
- Constructor kopiëren wordt aangeroepen wanneer een nieuw object wordt geïnitialiseerd met een bestaand object.
- Het object doorgegeven aan een functie als een niet-referentieparameter.
- Het object wordt geretourneerd uit de functie.
Laten we de constructor van de kopie begrijpen met een voorbeeld.
class copy {int num; public: copy () {} // default constructor copy (int a) {// initialisator constructor num = a; } kopie (kopiëren & c) {// constructor kopiëren num = c.num; } void show () {cout << num; }}; int main () {kopie A (200); // Object A gemaakt en geïnitialiseerd exemplaar B (A); // Kopieerconstructor genaamd kopie C = A; // Kopieer constructor genaamd kopie D; D = A; // exemplaar constructor niet aangeroepen omdat object D niet nieuw aangemaakt object. // het is een toewijzingsbewerking. retourneer 0; }
In de bovenstaande code had ik expliciet een constructor "copy (copy & c)" verklaard. Deze kopie-constructor wordt aangeroepen wanneer object B wordt geïnitialiseerd met object A. Tweede keer dat het wordt aangeroepen wanneer object C wordt geïnitialiseerd met object A. Wanneer object D wordt geïnitialiseerd met object A, wordt de kopie-constructor niet aangeroepen omdat D wordt geïnitialiseerd het is al in het bestaan, niet in de nieuw gecreëerde. Daarom wordt hier de toewijzingsoperator aangeroepen.
Definitie van toewijzingsoperator
De toewijzingsoperator is een toewijzende operator van C ++. De operator "=" wordt gebruikt om de toewijzingsoperator aan te roepen. Het kopieert de gegevens in één object identiek aan een ander object. De opdrachtoperator kopieert het ene object naar het andere lid. Als u de toewijzingsoperator niet overbelast, voert deze de bitgewijze kopie uit. Daarom moet u de toewijzingsoperator overbelasten.
class copy {int num; public: copy () {} // default constructor copy (int a) {// initialisator constructor num = a; } void show () {cout << num; }}; int main () {kopie A (200); // Object A gemaakt en geïnitialiseerd exemplaar B (300); // Object B gemaakt en geïnitialiseerd B = A; // toewijzingsoperator ingeroepen kopie C; C = A; // toewijzingsoperator ingeroepen retour 0; }
In de bovenstaande code wanneer objectA is toegewezen aan object B, wordt de toewijzingsoperator aangeroepen omdat beide objecten al bestaan. Op dezelfde manier is hetzelfde het geval wanneer object C wordt geïnitialiseerd met object A.
Wanneer de bitsgewijze toewijzing wordt uitgevoerd, deelt zowel het object dezelfde geheugenlocatie als wijzigingen in één object reflecteren in een ander object.
Belangrijkste verschillen tussen Copy Constructor en Assignment Operator
- Een kopie-constructor is een overbelaste contructor waarbij als toewijzingsoperator een bitsgewijze operator is.
- Met de copy-constructor kunt u een nieuw object initialiseren met een bestaand object. Aan de andere kant kopieert een opdrachtoperator een object naar het andere object, die beide al bestaan.
- Een kopieconstcor wordt geïnitialiseerd wanneer een nieuw object wordt geïnitialiseerd met een reeds bestaand object, wanneer een object wordt doorgegeven aan een functie als parameter voor niet-referencering, of wanneer een object wordt geretourneerd uit een functie. Aan de andere kant wordt een toewijzingsoperator alleen aangeroepen wanneer een object wordt toegewezen aan een ander object.
- Wanneer een object wordt geïnitialiseerd met de copy-constructor, delen het initialiseringsobject en het geïnitialiseerde object de verschillende geheugenlocatie. Aan de andere kant, wanneer een object wordt geïnitialiseerd met behulp van een toewijzingsoperator, delen de geïnitialiseerde en initialiserende objecten dezelfde geheugenlocatie.
- Als u niet expliciet een kopieerconstructor definieert, levert de compiler er een. Aan de andere kant, als u een opdrachtbeheerder niet overbelast, wordt een bitgewijze kopieerbewerking uitgevoerd.
Conclusie:
De constructor Copy is het beste voor het kopiëren van het ene object naar het andere wanneer het object onbewerkte pointers bevat.