Recomandat, 2024

Alegerea Editorului

Diferența dintre constructorul de copiere și operatorul de asignare în C ++

Copy constructor și operatorul de atribuire, sunt cele două moduri de a inițializa un obiect folosind un alt obiect. Diferența fundamentală dintre constructorul de copiere și operatorul de atribuire constă în aceea că constructorul de copiat alocă memorie separată atât obiectelor, adică noului obiect țintă și obiectului sursă. Operatorul de atribuire alocă aceeași locație de memorie obiectului nou creat, precum și obiect sursă.

Să studiem diferența dintre constructorul de copiat și operatorul de atribuire.

Diagramă de comparație

Bazele comparațieiCopy ConstructorOperatorul asignării
De bazăConstructorul de copiatoare este un constructor supraîncărcat.Operatorul de atribuire este un operator bitwise.
SensConstructorul de copiere inițializează noul obiect cu un obiect deja existent.Operatorul de atribuire atribuie valoarea unui obiect unui alt obiect, ambele existente deja.
Sintaxănume_clasă (cont nume_clasă și nume_obiect) {
// corpul constructorului
}
Nume_clasă Ob1, Ob2;
Ob2 = OB1;
invocă(1) Constructorul de copiere invocă atunci când un obiect nou este inițializat cu unul existent.
(2) Obiectul a fost transferat unei funcții ca parametru non-referință.
(3) Obiectul este returnat din funcție.
Operatorul de atribuire este invocat numai atunci când atribuie obiect existent unui obiect nou.
Alocare de memorieAtât obiectul țintă, cât și obiectul inițial partajează diferitele locații de memorie.Atât obiectul țintă, cât și obiectul inițializant au aceeași memorie alocată.
Mod implicitDacă nu definiți niciun constructor de copie în program, compilatorul C ++ oferă implicit unul.Dacă nu supraîncărcați operatorul "=", se va face o copie bitwise.

Definiția Copy Constructor

Un "constructor de copiatoare" este o formă de constructor supraîncărcat . Un constructor de copie este chemat sau invocat doar pentru scop de inițializare. Un constructor de copiere iniționează obiectul nou creat de un alt obiect existent. Când un constructor de copiere este utilizat pentru a inițializa obiectul țintă nou creat, atât obiectul țintă, cât și obiectul sursă partajează o locație de memorie diferită. Modificările aduse obiectului sursă nu reflectă obiectul țintă. Forma generală a constructorului de copiat este

 nume_clasă (nume_clasă și nume_obiect) {. // corp de copiatoare. } // nume_obiect se referă la obiectul din partea dreaptă a inițializării. 

Dacă programatorul nu creează un constructor de copiere într-un program C ++, atunci compilatorul furnizează implicit un constructor de copiere. Un constructor de copie implicit furnizat de compilator face copia membrului sursă obiect. Dar, uneori, copia membrilor nu este suficientă, deoarece obiectul poate conține o variabilă a indicelui. Prin copierea unei variabile de pointer înseamnă că copiem adresa stocată în variabila indicator, dar nu dorim să copiem adresa stocată în variabila indicelui, ci să copiem ce indica indicatorul. Prin urmare, este nevoie de un "copy constructor" explicit în program pentru a rezolva astfel de probleme.

Un constructor de copie este invocat în trei condiții, după cum urmează:

  • Constructorul de copiere invocă atunci când un obiect nou este inițializat cu unul existent.
  • Obiectul a trecut la o funcție ca parametru de referință.
  • Obiectul este returnat din funcție.

Să înțelegem constructorul de copiat cu un exemplu.

 clasa copie {int num; public: copie () {} // copy constructor implicit (int a) {// initializarea constructorului num = a; } copie (copy & c) {// Copy constructor num = c.num; } void show () {cout << num; }}; int main () {copie A (200); // Obiect O copie creată și inițializată B (A); // constructor de copiat numit copie C = A; // constructor de copiat numit copie D; D = A; // constructorul de copiere nu este numit deoarece obiectul D nu este nou creat. // este o operațiune de atribuire. retur 0; } 

În codul de mai sus, am declarat în mod explicit constructorului "copy (copy & c)". Acest constructor de copii este apelat atunci când obiectul B este inițializat folosind obiectul A. A doua oară se numește atunci când obiectul C este inițializat folosind obiectul A. Când obiectul D este inițializat folosind obiectul A, constructorul de copiere nu este numit deoarece atunci când D este inițializat acesta este deja în existență, nu cel nou creat. Prin urmare, aici este invocat operatorul de atribuire.

Definiția Assignment Operator

Operatorul de atribuire este un operator care atribuie C ++. Operatorul "=" este folosit pentru a invoca operatorul de atribuire. Se copiază datele într-un obiect identic cu un alt obiect. Operatorul de atribuire copiază un obiect la altul. Dacă nu supraîncărcați operatorul de atribuire, acesta efectuează copia bitwise. Prin urmare, trebuie să supraîncărcați operatorul de atribuire.

 clasa copie {int num; public: copie () {} // copy constructor implicit (int a) {// initializarea constructorului num = a; } void show () {cout << num; }}; int main () {copie A (200); // Obiect O copie creată și inițializată B (300); // Obiect B creat și inițializat B = A; // operatorul de cesiune invocat copia C; C = A; // operatorul asignat returnat inversat 0; } 

În codul de mai sus când obiectul A este atribuit obiectului B, operatorul de atribuire este invocat deoarece ambele obiecte există deja. În mod similar, același lucru este cazul atunci când obiectul C este inițializat cu obiectul A.

Când se realizează asignarea biților, ambele obiecte partajează aceeași locație de memorie, iar modificările dintr-un obiect reflectă un alt obiect.

Diferențe cheie între constructorul de copiere și operatorul de asignare

  1. Un constructor de copiat este un contructor supraîncărcat unde un operator de atribuire este un operator bitwise.
  2. Folosind constructorul de copiere puteți inițializa un obiect nou cu un obiect deja existent. Pe de altă parte, un operator de cesiune copiază un obiect la celălalt obiect, ambele fiind deja existente.
  3. Un constructor de copiere este inițializat ori de câte ori un obiect nou este inițializat cu un obiect deja existent, atunci când un obiect este trecut la o funcție ca parametru non refrence sau când un obiect este returnat dintr-o funcție. Pe de altă parte, un operator de atribuire este invocat numai atunci când un obiect este atribuit unui alt obiect.
  4. Când un obiect este inițializat utilizând constructorul de copiere, obiectul de inițializare și obiectul inițializat împărtășesc locația de memorie diferită. Pe de altă parte, când un obiect este inițializat utilizând un operator de atribuire, obiectele inițializate și inițializate au aceeași locație de memorie.
  5. Dacă nu definiți în mod explicit un constructor de copiere, atunci compilatorul oferă unul. Pe de altă parte, dacă nu supraîncărcați un operator de asignație, atunci se efectuează o operație de copiere bitwise.

Concluzie:

Constructorul de copiere este cel mai bun pentru copierea unui obiect la altul atunci când obiectul conține indicii brute.

Top