3.5. Constructor de copiere (atribuire)

3.5. Constructor de copiere (atribuire)

Dac? ?ntr-o clas? nu definim nici un constructor, compilatorul creeaz? implicit un constructor f?r? parametri. ?n afar? de acesta, compilatorul mai creeaz? implicit un constructor care se denume?te constructor de copiere, sau constructor de atribuire, sau constructor ini?ializator. Constructorul de copiere are un parametru – referin?? la un obiect surs? al aceleia?i clase. ?ndeplinirea constructorului de copiere const? ?n copierea pe bi?i a con?inutului argumentului (obiectului surs? deja cunoscut) ?n obiectul ce se creeaz?.

Existen?a constructorului implicit de copiere ?n clasa fractie_rationala() poate fi demonstrat? prin apelul explicit al acestuia. Inser?m ?n func?ia main() a exemplului precedent urm?torul cod:

fractie_rationala fr2(1, 3);

fractie_rationala fr3(fr2); // forma uzual? de aplicare a constructorului de copiere

// ?nc? o modalitate

fractie_rationala fr4=fractie_rationala(fr2);

Acest fragment va fi compilat cu succes. Aici constructorul de copiere a fost folosit la crearea obiectului fr3 ?n baza obiectului fr2, ?i la crearea obiectului fr4 la fel ?n baza obiectului fr2. Aten?ie! A doua modalitate este mai pu?in uzual?. Ea poate s? se comporte diferit, ?n dependen?? de compilator. Un compilator poate s? creeze un obiect nou direct cu ajutorul constructorului de copiere. Alt compilator creeaz? acest obiect ?n patru etape: creeaz? obiectul cu ajutorul constructorului f?r? argumente, apoi unul temporar cu ajutorul constructorului de copiere, dup? aceasta aplic? operatorul de atribuire de la obiectul temporar la obiectul nou creat, iar la sf?r?it distruge obiectul temporar.

?n exemplul precedent s-a folosit constructorul de copiere creat implicit de c?tre compilator. ?ns?, putem defini constructorul de copiere ?i explicit. Forma general? de definire explicit? a unui constructor de copiere este urm?toarea:

 

c?nd constructorul se define?te ?n declararea clasei[inline ][nume_clas?::]nume_clas?(

[const ]nume_clas? &nume_obiect_surs?)

{

   // codul constructorului de copiere

   …

}

sau antetul

[inline ][nume_clas?::]nume_clas?(

[const ]nume_clas? &[nume_obiect_surs?]);

?n declararea clasei, ?i defini?ia

[inline ]nume_clas?::nume_clas?(

[const ]nume_clas? &nume_obiect_surs?)

{

   // codul constructorului de copiere

   …

}

dup? declararea clasei.

Re?ine?i! Compilatorul nu creeaz? implicit constructorul f?r? parametri, dac? clasa dispune m?car de un singur constructor oarecare definit explicit. Constructorul de copiere nu se creeaz? implicit numai ?n cazul c?nd el este definit explicit.

Constructorul de copiere se folose?te explicit sau implicit ?n urm?toarele cazuri:

  • c?nd cre?m un obiect al unei clase ini?ializ?ndu-l cu un alt obiect deja existent al aceleia?i clase (exemple au fost aduse);
  • c?nd obiectul se folose?te la apelul unei func?ii ?n calitate de argument care se transmite prin valoare (copie). ?n acest caz, ?n func?ia respectiv? se creeaz? o copie a obiectului cu ajutorul constructorului de copiere (exemplele vor urma pe parcursul expunerii);
  • c?nd se creeaz? cu ajutorul constructorului de copiere un obiect temporar care poate fi folosit ?n expresii. Cu toate c? ?nc? nu am cercetat expresiile cu obiecte, imagina?i-v? urm?torul exemplu. ?n clasa fractie_rationala definim un constructor de copiere care nu copie pe bi?i, ci atribuie frac?ia redus? obiectului ce se creeaz?. Presupunem c? obiectul fr5 are valoarea 2/4, atunci expresia fractie_rationala(fr5) va avea valoarea 1/2. Re?ine?i acest moment, ?l ve?i cerceta de sine st?t?tor ?n viitorul apropiat. Pentru aceasta va trebui s? defini?i explicit ?n clasa fractie_rationala acest constructor de copiere.

_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов