NOIUNI TEORETICE
O clas reprezint un tip abstract de date, care ncapsuleaz att elementele de date (datele membre) pentru care s-a adoptat un anumit mod de reprezentare, ct i operaiile asupra datelor (funciile membre sau metode). n limbajul C++, structurile i uniunile reprezint cazuri particulare ale claselor, putnd avea nu numai date membre sau cmpuri de date, dar i funcii membre. Singura diferen ntre structuri i uniuni const n faptul c la uniuni, pentru memorarea valorilor datelor membre se folosete n comun - aceeai zon de memorie. Deosebirea esenial ntre structuri i uniuni - pe de o parte - i clase - pe cealat parte - const n modul de acces la membri: la structuri i uniuni membrii (datele i metodele) sunt implicit publici, iar la clase - implicit privai (membrii sunt ncapsulai). Lipsa unor modaliti de protecie a datelor face ca tipurile de date introduse prin structuri sau uniuni s nu poat fi strict controlate n ceea ce privete operaiile executate asupra lor. n cazul claselor, modul de acces la membrii tipului de date (n scopul protejrii acestora) poate fi schimbat prin utilizarea modificatorilor de control ai accesului: public, private, protected.
1. Declararea Claselor
Modul de declarare a unei clase este similar celui de declarare a structurilor i a uniunilor: class [<nume_clasa>]{ <modificator_control_acces>: <lista_declaratii_membri>; } [<lista_variabile>]; Clasa reprezint un tip de date (definit de utilizator). Membrii unei clase sunt: Datele membre - datele declarate n cadrul clasei; Metodele - funciile membre, funciile declarate sau definite n cadrul clasei.
Pentru membrii care apar n lista_membrilor se poate preciza un anumit mod de acces.
1
Modificator_control_acces poate fi public, private sau protected (eventual friend). Dac nu se specific, este considerat cel implicit (private). Modificatorul de acces public se utilizeaz pentru membrii care dorim s fie neprotejai, ultimii doi modificatori asigurnd protecia membrilor din domeniul de aciune a lor. Membrii cu acces private pot fi accesai numai prin metodele clasei (sau prin funciile prietene). Cei cu acces protected posed caracteristicile celor privai, dar, n plus, pot fi accesai i din clasele derivate. Specificatorii modului de acces pot apare n declararea clasei de mai multe ori, n orice ordine. Domeniul unui modificator de acces ine din punctul n care apare modificatorul respectiv, pn la sfritul declaraiei clasei sau al ntlnirii altui modificator de acces. <nume_clasa> poate lipsi din declaraie, ns n acest caz, n <lista_variabile> trebuie s fie prezent cel puin un identificator_varabila. <lista_variabile> poate lipsi, ns, n acest caz, este obligatorie prezena unui <nume_clasa>. Variabilele din lista_variabile sunt de tipul nume_tip i se numesc instane (obiecte) ale clasei.
2. Instanierea Claselor
Instanierea unei clase const n declararea unor variabile de tip definit cu ajutorul clasei. O astfel de variabil, numit obiect (sau instan a clasei) este o dat de tip definit prin clas. Se pot declara oricte obiecte (instane) ale clasei. Declararea obiectelor de un anumit tip are o form asemntoare celei pentru datele de tip predefinit: <nume_clasa> <lista_obiecte>; Exemple: dreptunghi a; dreptunghi b, c, d;
Datele membru se aloc distinct pentru fiecare instan (atribute ale instanei) a clasei. Excepia de la aceast regul o constituie datele membru statice, care exist ntr-un singur exemplar, comun, pentru toate instanele clasei. Metodele figureaz ntr-un singur exemplar, oricte instane ale clasei ar exista. Operatorul :: (scope resolution operator) specific relaia de apartenen a metodei la clas. Operatorul cupleaz <nume_clasa>::<nume_functie_membru> i definete domeniul (scopul) n care acea funcie va fi recunoscut. Prezena numelui clasei n faa
2
funciei membru este obligatorie, deoarece, altfel nu s-ar putea face distincia ntre metode cu nume identice (cu acelai prototip), care aparin unor clase diferite. O funcie membru se apeleaz totdeauna n strns dependen cu un obiect din clasa respectiv. Legtura dintre obiect i funcia membr se face prin operatorul . sau operatorul ->, dup cum obiectul este desemnat prin nume sau prin pointer. n plus, metodele statice pot fi apelate independent de un obiect al clasei, folosind operatorul de rezoluie (::).
4. Pointerul this
Fiecare funcie membr posed un argument ascuns, numit this, argument transmis n mod automat de ctre compilator. Aceast variabil (local funciilor membru) reprezint pointerul ctre obiectul curent (cel care apeleaz metoda). Deoarece o metod static se apeleaz independent de un obiect al clasei, pointerul this nu mai poate fi utilizat.
5. Funcii inline
La apelul unei funcii obinuite se ntrerupe execuia funciei apelante i se execut un salt la adresa de memorie la care se gsete corpul funciei apelate. La terminarea execuiei funciei apelate se revine n funcia apelant, relundu-se execuia cu instruciunea imediat urmtoare apelului de funcie. n situaiile n care corpul funciei apelate este format din cteva instruciuni, operaiile descrise anterior (implicate n apel i revenire) pot fi mai complicate dect un apel prin expandare (n care apelul funciei n funcia apelant este nlocuit cu nsui corpul funciei apelate). Pentru eliminarea acestor dezavantaje, se folosesc funciile inline. Prezena funciilor inline anun compilatorul s nu mai genereze instruciunile n cod main necesare apelului i revenirii, ceea ce conduce la mrirea timpului de compilare n favoarea micorrii timpului de execuie. Utilizarea funciilor inline se justific doar n situaiile n care codul generat de compilator pentru execuia corpului funciei este mai mic dect codul generat pentru apel i revenire. Practic, funciile care au corpul format din maximum trei instruciuni i nu conin instruciuni repetitive (for, while, do-while), pot fi declarate inline. Declararea unei funcii inline se realizeaz explicit, specificnd n antetul funciei respective cuvntul cheie inline. inline <tip_val_ret> <nume_fct> (<lista_declar_par_formali>); n cazul metodelor unei clase, dac acestea sunt definite n interiorul clasei, ele sunt considerate, implicit, funcii inline.
3
Exist i posibilitatea de a declara metoda la declararea clasei i de a specifica, explicit, c este funcie inline la definirea funciei.
6. Constructori
Constructorii sunt metode speciale care folosesc la crearea i iniializarea instanelor unei clase. Constructorii au acelai nume ca i clasa creia i aparin i sunt apelai de fiecare dat cnd se creaz noi instane ale clasei. Constructorii asigur iniializarea corect a tuturor variabilelor membre ale obiectelor unei clase i constituie o garanie a faptului c iniializarea unui obiect se realizeaz o singur dat. O clas poate avea mai muli constructori, care difer ntre ei prin numrul i tipul parametrilor acestora. Proprietile constructorilor: Constructorii au acelai nume ca i numele clasei creia i aparin; Nu ntorc nici o valoare (din corpul lor lipsete intruciunea return <expr>; n antetul constructorilor nu se specific niciodat la tipul valorii returnate cuvntul cheie void); Constructorii unei clase nu pot primi ca parametri instane ale clasei respective, ci doar pointeri sau referine la instanele clasei respective; Apelul constructorului se realizeaz la declararea unui obiect; Adresa constructorilor nu este accesibil utilizatorului; Constructorii nu pot fi metode virtuale; n cazul n care o clas nu are nici constructor declarat de ctre programator, compilatorul genereaz un constructor implicit, fr nici un parametru, cu lista instruciunilor vid. Dac exist un constructor al programatorului, compilatorul nu mai genereaz constructorul implicit; Parametrii unui constructor nu pot fi de tipul definit de clasa al crei membru este constructorul.
7. Destructori
Destructorii sunt metode ale claselor care acioneaz n sens invers, complementar, fa de constructori. Constructorii sunt folosii pentru alocarea memoriei, iniializarea datelor membru sau alte operaii (cum ar fi, incrementarea unui contor pentru instanele clasei). Constructorul este apelat n momentul declarrii obiectelor. Destructorul elibereaz memoria alocat de constructori. Destructorul este apelat automat, la ieirea din blocul n care este recunoscut acel obiect. Proprietile destructorilor
4
Destructorul are acelai nume ca i clasa a cror metod este; Numele destructorului este precedat de semnul ~; clas are un singur destructor; Destructorul nu are parametri i nu returneaz nici o valoare (antetul nu conine cuvntul cheie void, iar n corpul destructorului nu apare instruciunea return <expresie>;); Dac programatorul nu a definit un destructor, compilatorul genereaz automat un destructor pentru clasa respectiv; Destructorii se apeleaz la ncheierea timpului de via a obiectelor, n ordine invers apelurilor constructorilor; Obiectele dinamice nu se distrug automat, deoarece doar programatorul tie cnd nu mai este necesar un astfel de obiect.
8. Tablouri de obiecte
Obiectele de acelai tip pot fi grupate n tablouri. Dac un tablou este declarat fr a fi iniializat, pentru construirea elementelor sale se apeleaz constructorul implicit. Elementele unui tablou pot fi iniializate i cu ajutorul constructorilor cu parametri.
9. Funcii prietene
Funciile prietene (friend) sunt funcii ne-membre ale unei clase, care au acces la datele membre private ale clasei. Funciile prietene ale unei clase trebuie precizate n definiia clasei. n acest sens, prototipurile unor astfel de funcii sunt precedate de cuvntul cheie friend. Spre deosebire de funciile membre, funciile prietene ale unei clase nu posed pointerul implicit this. De aceea, deosebirea esenial ntre dou funcii care realizeaz aceleai prelucrri, o funcie membr i o funcie prieten, const n faptul c funcia prieten are un parametru n plus fa de funcia membru. Observaie: Nici constructorii, nici destructorii nu pot fi funcii prietene ale unei clase. O funcie poate fi n acelai timp funcie membr a unei clase i funcie prieten a altei clase. Observaie: Relaia de clasa prieten nu este tranzitiv. Astfel, dac clasa cls1 este clasa prieten a clasei cls2, iar clasa cls2 este clas prieten a clasei cls3, aceasta nu implic faptul c, cls1 este clas prieten pentru cls3.
PROBLEME REZOLVATE
1. S se defineasc tipul de date dreptunghi, cu ajutorul unei structuri i a unei clase.
Datele membre sunt lungimea i limea (variabilele Lung, lat). Funciile membre sunt: void seteaza_dimen(double, double) - primete ca argumente dou valori reale i iniializeaz datele membre cu valorile argumentelor. double arata_Lung( ) - returneaz valoarea lungimii (a datei membre Lung). double arata_Lat( ) - returneaz valoarea limii (a datei membre lat). double calcul_arie( ) - returneaz valoarea ariei dreptunghiului.
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
n exerciiul 1a se definete tipul dreptunghi printr-o structur. Tipul conine att datele membre, ct i metodele care implementeaz operaiile care pot fi realizate asupra variabilelor de tipul dreptunghi. Metodele arata_Lung, arata_Lat, calcul_arie sunt definite n structur. Metoda seteaza_dimen este doar declarat n interiorul structurii (uniunii), fiind abia apoi definit. Nespecificnd nici un modificator de control al accesului, toi membrii (date i metode) sunt implicit publici. De aceea, de exemplu, atribuirea unei valori pentru data membr Lung se putea realiza, la fel de bine, n corpul funciei main, astfel: Lung=l1; (n exerciiul 1a, atribuirea se realizeaz cu ajutorul metodei seteaza_dimen).
//b) Implementarea tipului dreptunghi cu ajutorul unei clase
#include <iostream> using namespace std; class dreptunghi { double Lung, lat; public: void seteaza_dimen(double, double ); double arata_Lung() { return Lung; } double arata_Lat() { return lat; } double calcul_arie() { return Lung*lat; } }; void dreptunghi::seteaza_dimen(double L, double l) { Lung = L; lat = l; } int main() { dreptunghi a; double l1, l2; cout << "Lungime="; cin >> l1; cout << "Latime="; cin >> l2; a.seteaza_dimen(l1, l2); cout << "\nDimensiunile dreptunghiului sunt: "; cout << a.arata_Lung() << " si " << a.arata_Lat() << endl; cout << "\nAria dreptunghiului: " << a.calcul_arie() << endl; cout << "\nDimensiunea obiectului in memorie: " << sizeof(a) << endl; } 7
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
n exerciiul 1b se definete tipul de date dreptunghi cu ajutorul unei clase. Nivelul de acees implicit la membrii clasei este private. Dac pentru metode nu s-ar fi folosit modificatorul de acces public, metodele nu ar fi putut fi folosite n funcia main. Observaii: 1. Pentru fiecare membru (dat membru sau metod) al unei clase se poate specifica modul de control al accesului. Membrii publici (vizibili, accesibili din exterior) constituie interfaa public a clasei, iar membrii privai (ncapsulai, ascuni) ofer descrierea datelor membre ale fiecrei instane a clasei i detalii de implementare particulare clasei respective. 2. Pentru a indica faptul c metoda seteaz_dimen aparine tipului dreptunghi, se folosete operatorul scop :: (de apartenen). Astfel, la definirea metodei, prototipul ei va fi: void dreptunghi::seteaza_dimen(double L, double l); 3. A defini o clas presupune declararea acesteia i definirea tuturor metodelor sale.
REFERAT DE LABORATOR Nr. 2 void data::initializare(int zz, int ll, int aa) { zi=zz; luna=ll; an=aa; } void data::afiseaza() { char *den_lun[] = { "Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie", "Iulie","August","Septembrie","Octombrie","Noiembrie", "Decembrie"}; cout << zi << ", " << den_lun[luna-1] << ", " << an << endl; } int main() { data dat_nast; dat_nast.initializare(4, 6, 1980); cout << "\nData de nastere a lui Andrei este "; dat_nast.afiseaza(); int a,z,l; cout << "\nZiua in care te-ai nascut:"; cin >> z; cout << "Luna in care te-ai nascut:"; cin >> l; cout << "Anul in care te-ai nascut:"; cin >> a; data dat_nast_ta; dat_nast_ta.initializare(z, l, a); cout << "\nData nasterii tale este: "; dat_nast_ta.afiseaza(); }
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
REFERAT DE LABORATOR Nr. 2 class exemplu { int i; // data membra privata, acces la ea doar prin metode public: static int contor; // data membra publica, neprotejata (scop didactic) void inc() { i++; } void arata_i() { cout << "i=" << i << endl; } void inc_contor() { contor++; } void init() { i=0; } static void arata_contor() { cout << "Contor=" << contor << endl; } static void functie(exemplu*); } a1, a2, a3; int exemplu::contor=0; //initialiazarea datei membru statice
void exemplu::functie (exemplu *pe) { //i++; //eroare, nu se cunoaste obiectul care-l poseda pe i pe->i++; //corect, este specificat proprietarul lui i contor++; //variabila statica, comuna tuturor obiectelor } int main() { a1.init(); a2.init(); a3.init(); a1.arata_i(); a2.arata_i(); a3.arata_i(); cout << endl; a1.inc(); a2.inc(); a3.inc(); a1.arata_i(); a2.arata_i(); a3.arata_i(); cout << endl;
a1.functie(&a1); //contor=1, i=2 exemplu::arata_contor(); exemplu::functie(&a2); //contor=2, i=2 exemplu::arata_contor(); //functie(); //incorect a1.inc_contor(); //contor=3 exemplu::arata_contor(); a2.inc_contor(); //contor=4 exemplu::arata_contor(); a3.inc_contor(); //contor=5 exemplu::arata_contor(); cout << endl; exemplu::contor+=100; //membru public; contor=105 cout << "Contor=" << exemplu::contor << endl; //Contor=105 }
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
11
Din exemplul anterior, se poate observa c metoda static funcie poate fi apelat ca o metod obinuit, sau folosind operatorul ::. Pentru data membr static contor se rezerv o zon de memorie comun obiectelor a1, a2, a3. Pentru data membr i se realizeaz o copie pentru fiecare instan a clasei. De asemenea, deoarece data membr contor este static, nu aparine unui anume obiect, ea apare prefixat de numele clasei i operatorul de apartenen.
#include <iostream> #include <math.h> using namespace std; class complex { double real, imag; public: int citire(); 12
REFERAT DE LABORATOR Nr. 2 void afisare(); double modul(); double arg(); void incrpi() { imag++;} //incrementeaza partea imaginara; FUNCTIE INLINE, //implicit, fiind definita in interiorul clasei inline void decrpi(); //decrementarea partii imaginare double retreal(); double retimag(); //returneaza partea reala //returneaza partea imaginara
void adun_c(complex, complex); //aduna 2 numere complexe void inm_c(complex*, complex*); //produsul a 2 numere complexe }; inline double complex::modul() { return sqrt(real*real+imag*imag); } int complex::citire() { cout << "P. reala:"; if (!(cin>>real)) return 0; cout << "P. imag:"; if (!(cin>>imag)) return 0; return 1; } void complex::afisare() { if (imag>=0) cout << real << "+" << imag << "*i" << endl; else cout << real << imag << "*i\n"; } double complex::arg() { if (real==0 && imag==0) return 0.0; if (imag==0) if (real>0) return 0.0; else return M_PI; if (real==0) if (imag>0) return M_PI / 2; else return (3 * M_PI) / 2; double x = atan(imag/real); if (real<0) return M_PI + x; if (imag<0) return 2 * M_PI + x; return x; }
13
REFERAT DE LABORATOR Nr. 2 inline void complex::decrpi() { imag--; } double complex::retreal() { return real; } double complex::retimag() { return imag; } void complex::adun_c (complex x1, complex x2) { real = x1.real + x2.real; imag = x1.imag + x2.imag; } void complex::inm_c(complex *x1, complex *x2) { real = x1->real * x2->real - x1->imag * x2->imag; imag = x1->real * x2->imag + x1->imag * x2->real; } int main() { complex z1; z1.citire(); cout << "z1="; z1.afisare(); cout<<endl; complex z2; z2.citire(); cout << "z2="; z2.afisare(); cout<<endl; cout << "\nModulul z2 = " << z2.modul() << endl; cout << "Agument z2 = " << z2.arg() << endl; cout << "\nP. reala z2 = " << z2.retreal() << endl; cout << "P. imag z2 = " << z2.retimag() << endl; z2.incrpi(); cout << "\nDupa increm p imag = " << z2.retimag() << endl; cout << "Noul z2: "; z2.afisare(); complex z3; z3.adun_c(z1,z2); cout << "\nAdunare z1 + z2 = "; z3.afisare(); complex *pz1=&z1, *pz2=&z2; z3.inm_c(pz1,pz2); cout << "\nInmultire z1 + z2 = "; z3.afisare(); }
14
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
utilizarea constructorilor (cu parametri implicii, de copiere, cu liste de iniializare) definii de programator.
#include <iostream> using namespace std; class Punct { public: Punct(double _x=0.0, double _y=0.0) { x = _x; y = _y; } //Constructor cu parametri impliciti Punct(const Punct& p) { x = p.x; y = p.y; } //Constructor de copiere void afiseaza(); // Metoda afiseaza private: double x, y; //Datele membre private //(coodonatele punctului: abscisa si ordonata) }; class Linie { public: Linie(const Punct& b, Punct& e) : p1(b), p2(e) {} //Constructor cu lista initializare void afiseaza(); private: 15
REFERAT DE LABORATOR Nr. 2 Punct p1, p2; //Datele membre private: //cele 2 puncte care determina dreapta }; void Punct::afiseaza() { cout << "(" << x << " , " << y << ")"; } void Linie::afiseaza() { cout << "\nLinie determinata de punctele: "; p1.afiseaza(); p2.afiseaza(); cout << endl; } int main() { Punct a(10,15), b(20,30); a.afiseaza(); cout << endl; b.afiseaza(); cout << endl; Punct c(a); c.afiseaza(); cout << endl; Linie l1(a,b); l1.afiseaza(); }
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
ordonata unui punct. Operaiile care pot fi realizate asupra obiectelor de tip punct, sunt: afiare (afieaz coordonatele unui punct), deplasare (deplaseaz un punct, noile coordonate ale punctului fiind obinute prin adunarea unor valori transmise ca parametri, la valorile anterioare ale coordonatelor), abscisa (returneaz valoarea abscisei), ordonata (returneaz valoarea ordonatei). Se vor implementa, deasemenea, constructor cu parametri implicii, constructor avnd ca parametri valorile abscisei i a ordonatei, constructor de copiere i destructor.
16
S se defineasc tipul segment, cu datele membre A i B, de tip punct, reprezentnd capetele unui segment (originea i vrful). Operaiile care pot fi realizate asupra obiectelor de tip segment, sunt: afiare (afieaz coordonatele capetellor segmentului), deplasare (translateaz un segment, deplasnd capetele acestuia cu valorile transmise ca parametri), origine (returneaz originea segmentului), vrf (returneaz vrful segmentului). Se vor implementa, deasemenea, constructor, constructor de copiere i destructor. S se testeze tipurile de date punct i segment.
#include <iostream> #include <conio.h> using namespace std; //CLASA PUNCT class punct { double x,y; public: punct() { x=0; y=0; cout << "Constr. implicit pentru punct("; cout << x << "," << y << ")\n"; } //constructor initializare punct(double,double); punct(punct&); //constructor copiere ~punct(); //destructor
double abscisa() { return x; } double ordonata(){ return y;} void afisare(); void deplasare(double,double); }; //CLASA SEGMENT class segment { private: punct A,B; public: segment(punct&,punct&); //constructor segment(segment&); //constructor copiere ~segment(); //destructor punct& origine(); punct varf(); void afisare(); void translatie(double,double); };
17
REFERAT DE LABORATOR Nr. 2 //METODELE CLASEI PUNCT punct::punct(double valx,double valy) { x = valx; y = valy; cout << "Constructor punct(" << x << "," << y << ")\n"; } punct::~punct() { cout << "Destructor punct (" << x << "," << y << ")\n"; } punct::punct( punct &P) { x = P.x; y = P.y; cout << "Constructor copiere"; cout <<" pct (" << x << "," << y << ")\n"; } void punct::deplasare(double dx,double dy) { x+=dx; y+=dy; } void punct::afisare() { cout << "Punct (" << x << ',' << y << ')'; } //METODELE CLASEI SEGMENT segment::segment(punct &A1,punct &B1) { A = A1; B = B1; cout << "Constructor segment["; A.afisare(); B.afisare(); cout << "]\n"; } segment::segment(segment &AB) { A=AB.A; B=AB.B; cout << "Constructor copiere segment ["; A.afisare(); B.afisare(); cout << "]\n"; } punct& segment::origine() { return A; } punct segment::varf() { return B; } 18
REFERAT DE LABORATOR Nr. 2 void segment::afisare() { cout << "["; A.afisare(); cout << ','; B.afisare(); cout<< "]" << endl; } segment::~segment() { cout << "Destructor segment ["; A.afisare(); cout << ","; B.afisare(); cout << "]\n"; } void segment::translatie(double dx,double dy) { A.deplasare(dx,dy); B.deplasare(dx,dy); } int main() { { cout << " In urma instructiunii: "; cout << "punct P(7.8,-20.4),Q(-4.82,8.897),A,B; \n\n"; punct P(7.8,-20.4),Q(-4.82,8.897),A,B; // In urma instructiunii: punct P(7.8,-20.4),Q(-4.82,8.897),A,B; //Constructor punct (7.8,-20.4) (Pentru punctul P) //Constructor punct (-4.82,8.897) (Pentru punctul Q) //Constr. implicit pentru punct(0,0) (Pentru punctul A) //Constr. implicit pentru punct(0,0) (Pentru punctul B) cout << "\n In urma instructiunii: "; cout << "segment S(P,Q); \n\n"; segment S(P,Q); // In urma instructiunii: segment S(P,Q); //Constr. implicit pentru punct(0,0) //Constr. implicit pentru punct(0,0) //(pentru membrii A, B ai obiectului S, deci pentru S.A i S.B) //Constructor segment[Punct(7.8,-20.4)Punct(-4.82,8.897)] //(pentru obiectul S, de tip segment) cout << "\n In urma instructiunii: "; cout << "segment S1(A,B); \n\n"; segment S1(A,B); // In urma instructiunii: segment S1(A,B); //Constr. implicit pentru punct(0,0) //Constr. implicit pentru punct(0,0) //(pentru membrii A, B ai obiectului S1, //deci pentru S1.A si S1.B) //Constructor segment[Punct (0,0)Punct (0,0)] //(pentru obiectul S1, de tip segment) cout << "\n------------------------------"; cout << "\nApasa un car. ptr. continuare!"; cout << "\n------------------------------"; getch();
19
REFERAT DE LABORATOR Nr. 2 cout << "\n Afisari pentru puncte:\n\n"; cout << "P: "; P.afisare(); cout << endl; cout << "Q: "; Q.afisare(); cout << endl; cout << "A: "; A.afisare(); cout << endl; cout << "B: "; B.afisare(); cout << endl; // Afisari pentru puncte: //P: Punct (7.8,-20.4) //Q: Punct (-4.82,8.897) //A: Punct (0,0) //B: Punct (0,0) cout << "\n Afisari pentru segmente:\n\n"; cout << "S: "; S.afisare(); cout << "S1: "; S1.afisare(); cout << endl; // Afisari pentru segmente: //S: [Punct (7.8,-20.4),Punct (-4.82,8.897)] //S1: [Punct (0,0),Punct (0,0)] cout << "\n In urma operatiei de atribuire: A=P\n"; A=P; cout << "Punctul A: "; A.afisare(); cout << endl; // In urma operatiei de atribuire: A=P //Punctul A: Punct (7.8,-20.4) cout << "\n In urma instructiunii: punct CC=A;\n"; punct CC=A; // Constructor copiere pct (7.8,-20.4) cout << "Punctul CC: "; CC.afisare(); cout << endl; // In urma instructiunii: punct CC=A; //Constructor copiere pct (7.8,-20.4) //Punctul CC: Punct (7.8,-20.4) cout << "\n------------------------------"; cout << "\nApasa un car. ptr. continuare!"; cout << "\n------------------------------"; getch(); cout << "\n\n Se deplaseaza punctul CC cu valorile 10, 20\n"; cout << "Noile coord.: "; CC.deplasare(10, 20); CC.afisare(); cout << endl; //Se deplaseaza punctul CC cu valorile 10, 20. //Noile coord.: Punct (17.8,-10.4) cout << "Abscisa CC: " << CC.abscisa(); cout << " Ordonata CC:" << CC.ordonata() << endl; //Abscisa CC:17.8 Ordonata CC:-0.4
20
REFERAT DE LABORATOR Nr. 2 cout << "\n Varf segment S afisat sub forma: "; cout << "(S.varf()).afisare()\n"; (S.varf()).afisare(); // Varf segment S afisat sub forma: (S.varf()).afisare() //Constructor copiere pct (-4.82,8.897) //(metoda varf returneaza un punct, copiere) //Punct (-4.82, 8.897) Destructor punct (-4.82,8.897) cout << "\n Origine segment S: "; CC = S.origine(); CC.afisare(); cout << endl; //Origine segment S: Punct (7.8,-20.4) cout << "\n Dupa operatia de atribuire: S1=S\n"; S1=S; //operatie de atribuire cout << "S1: "; S1.afisare(); // Dupa operatia de atribuire: S1=S //S1: [Punct (7.8,-20.4),Punct (-4.82,8.897)] cout << "\n Translatie S1 cu 100,1000.\nS1 translatat este: "; S1.translatie(100, 1000); S1.afisare(); // Translatie S1 cu 100,1000. //S1 translatat este: //[Punct (107.8,979.6),Punct (95.18,1008.897)] cout << "\nIesire din blocul interior\n"; cout << "\n------------------------------"; cout << "\nApasa un car. ptr. continuare!"; cout << "\n------------------------------\n"; getch(); } cout << "Iesire din main"; } //La iesirea din functia main, deci la terminarea duratei de viata //a obiectelor, se apeleaz automat destructorii, n ordinea invers //in care au fost apelati constructorii, astfel: //Destructor punct (7.8,-20.4) (pentru CC) //Destructor segment [Punct (107.8,979.6),Punct (95.18,1008.897)] //(pentru segmentul S2) //Destructor punct (95.18,1008.897) //Destructor punct (107.8,979.6) //(pentru membrii B, respectiv A, ai segmentului S2: S2.B,apoi S2.A) //Destructor segment [Punct (7.8,-20.4),Punct (-4.82,8.897)] //(pentru segmentul S) //Destructor punct (-4.82,8.897) //Destructor punct (7.8,-20.4) //(pentru membrii B, respectiv A, ai segmentului S: S.B, apoi S.A) //Destructor punct (0,0) (pentru punctul B) //Destructor punct (7.8,-20.4) (pentru punctul A) //Destructor punct (-4.82,8.897) (pentru punctul Q) //Destructor punct (7.8,-20.4) (pentru punctul P)
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
21
22
REFERAT DE LABORATOR Nr. 2 mic.setare(5, 7); mare.setare(15, 20); for (int index = 1 ; index < 4 ; index++) //pentru vect[0] datele membre Lung si Lat raman cu valorile 8 si 8 vect[index].setare(index + 10, 10); cout << "\nAria dreptunghiului mic este "; cout << mic.calcul_arie() << endl; cout << "\nAria dreptunghiului mediu e "; cout << mediu.calcul_arie() << endl; cout << "\nAria dreptunghiului mare e "; cout << mare.calcul_arie() << endl << endl; for (int index = 0 ; index < 4 ; index++) { cout << "Ariile elementului de indice " << index; cout << " din vector=" << vect[index].calcul_arie(); cout << endl; } }
n continuare, am introdus capturi de ecran din timpul execuiei programului, pentru a se putea urmri execuia programului de test.
24
2. S se scrie un program care citete cte dou date de tip complex, pn la ntlnirea
perechii de date (z1=0+i*0, z2=0+i*0). Pentru fiecare pereche de date, s se afieze suma, diferena, produsul i ctul.
25