3.3. Apelurile constructorilor ?i destructorilor

3.3. Apelurile constructorilor ?i destructorilor

Cercet?m apelurile constructorului ?i destructorului. Pentru aceasta, redefinim temporar, numai cu scopuri demonstrative, func?iile implicite constructor ?i destructor ?n clasa fractie_rationala, modific?nd totodat? ?i func?ia main():

#include "iostream.h"
 
class fractie_rationala
{
   protected:
      unsigned int numarat;
      unsigned int numit;
   public: // sec?iunea de descriere a membrilor publici
      fractie_rationala(); // antetul constructorului
      ~fractie_rationala(); // antetul destructorului
};
 
fractie_rationala::fractie_rationala() // realizarea
{                                    // constructorului
   cout << "Lucreaza constructorul\n";
}
 
fractie_rationala::~fractie_rationala() // realizarea 
{                                     // destructorului
   cout << "Lucreaza destructorul\n";
}
 
void main()
{
   {  // deschidem un bloc intern
      fractie_rationala fr1;
      fractie_rationala fr2=fractie_rationala();
 
      fr1 = fr2;
 
      fr2.~fractie_rationala(); // apelarea destructorului
                                // pentru fr2
   }  // ?nchidem blocul intern
 
   char c; 
   cin >> c;
}

 


Dup? cum observ?m, ?n clasa fractie_rationala au fost redefinite func?iile constructor ?i destructor implici?i. Acum ele afi?eaz? informa?ii c? sunt ?n ac?iune (special f?cut pentru exemplu). Toate ac?iunile cu obiecte ?n func?ia main() au fost incluse ?ntr-un bloc intern. Astfel, obiectele fr1 ?i fr2 au devenit locale pentru acest bloc ?i vor fi distruse la ie?irea din el. Rezultatul programului va fi afi?area urm?torului text:

Lucreaza constructorul
Lucreaza constructorul
Lucreaza destructorul
Lucreaza destructorul
Lucreaza destructorul

Analiz?m: din care cauz? va fi a?a? Imediat dup? intrarea ?n blocul interior al func?iei main() se creeaz? obiectul fr1 ?i, deci, va fi apelat constructorul (primul mesaj: Lucreaza constructorul).

Apoi, se creeaz? obiectul fr2 (al doilea mesaj Lucreaza constructorul). Mai departe se execut? atribuirea de la fr2 la fr1, care a fost deja discutat? mai sus.

Apoi, special (?n scopul demonstr?rii) se apeleaz? destructorul pentru obiectul fr2 (ca rezultat, apare primul mesaj: Lucreaza destructorul). Dup? aceasta va fi atins sf?r?itul blocului intern.

La ie?ire din bloc vor fi distruse obiectele fr1 ?i fr2, fiind locale pentru acest bloc. La distrugerea obiectelor, ?n mod automat, pentru fiecare dintre aceste dou? obiecte va fi apelat destructorul clasei fractie_rationala (?nc? dou? mesaje: Lucreaza destructorul).

C?teva observa?ii.

Urm?toarele dou? instruc?iuni:

fractie_rationala fr2;

?i:

fractie_rationala fr2=fractie_rationala();

sunt perfect echivalente. A doua instruc?iune arat? ?n mod evident apelul constructorului. Pe c?nd instruc?iunea:

fractie_rationala fr2;

nu este echivalent? cu instruc?iunea:

fr2=fractie_rationala();

fiindc? a doua atribuie obiectului deja creat (fr2) valoarea obiectului care se creeaz? temporar. La crearea obiectului temporar va fi apelat implicit constructorul, apoi valoarea obiectului temporar va fi atribuit? obiectului fr2, dup? aceasta va fi apelat destructorul pentru obiectul temporar, ?i, ?n consecin??, obiectul temporar va fi distrus, iar obiectul fr2 r?m?ne cu noua valoare.

?n ce ordine vor fi apela?i destructorii la ie?ire din blocul intern? Mai ?nt?i pentru fr1 sau pentru fr2? R?spunsul, a c?rui verificare r?m?ne ca exerci?iu, este urm?torul: destructorii vor fi apela?i ?n ordine opus? ordinii de creare a obiectelor. Mai ?nt?i a fost creat fr1 ?i apoi fr2. Deci, mai ?nt?i va fi apelat destructorul pentru obiectul fr2, dup? ce va fi apelat destructorul pentru fr1.

Atrage?i aten?ia ?nc? o dat? cum au fost apelate func?iile destructor ?n exemplele precedente. Acesta este modul general de apelare a func?iilor membre accesibile.

 

Modul general de apelare al func?iilor membre din afara clasei este:obiect.[nume_clas?::]nume_func?ie_membr?(list?_argumente)

Deci, indic?m numele obiectului, apoi operatorul de accesare la membrii (.), dup? aceea numele func?iei membre ?i lista argumentelor ?n paranteze. Atunci c?nd se acceseaz? o func?ie membr? dintr-o alt? func?ie membr? pentru unul ?i acela?i obiect, prefixul ?obiect.? se omite.

 

Modul general de apelare al func?iilor membre din interiorul clasei este:[nume_clas?::]nume_func?ie_membr?(list?_argumente)

_________________________
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 сайтов