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
Оставить комментарий