Documente Academic
Documente Profesional
Documente Cultură
Lab2 POO PDF
Lab2 POO PDF
1.
2.
3.
Referine ............................................................................................................................................ 5
4.
Exerciii.............................................................................................................................................. 6
Modul de acces poate fi definit prin unul din cuvintele cheie public, private sau
protected. Acesta indic dreptul de acces la membrii definii dup el.
Membrii declarai cu private sunt accesibili doar membrilor din cadrul aceleiai clase. Membrii
declarai cu public sunt accesibili att membrilor din cadrul aceleiai clase ct i membrilor altor clase,
de oriunde, din interiorul sau din afara acelor clase. Membrii declarai cu protected sunt accesibili
att membrilor aceleiai clase ct i membrilor claselor derivate din ea.
n mod implicit, toi membrii unei clase au modul de acces private.
De exemplu:
class Dreptunghi {
int lungime, latime;
public:
void setLungime (int);
void setLatime (int);
int arie (void);
};
Exemplul declar o clas (adic un tip de dat abstract) numit Dreptunghi. Aceasta conine
cinci membri: dou cmpuri de tip int (lungime i latime) cu modul de acces privat i trei metode cu
modul de acces public: setLungime(int), setLatime(int) i arie(). Pentru moment am inclus
doar declaraia acestor metode, nu i definiia lor.
Pentru a declara un obiect (o variabil) cu numele dr, vom folosi urmtoarea instruciune:
Dreptunghi dr;
unde Dreptunghi reprezint numele clasei, iar dr obiectul instaniat. Prin aceast instruciune,
se aloc obiectului dr o zon de memorie corespunztoare membrilor de tip dat (cmpuri) de lungime
2 * sizeof(int) = 8 octei, cmpurile nefiind iniializate.
n afara clasei, cu ajutorul acestui obiect putem accesa membrii publici, folosind urmtoarea
sintax:
numeObiect.numeMembru;
Accesul la membrii unei clase este foarte asemntor cu accesul datelor dintr-o structur. De
exemplu:
dr.setLatime(10);
dr.setLungime(20);
valArie = dr.arie();
Singurii membri ai obiectului dr pe care nu-i putem accesa n corpul programului nostru, din
afara clasei, sunt lungime i latime, deoarece au accesul privat.
n continuare, vom completa clasa Dreptunghi cu definiia metodelor membre:
// exemplu de clasa
#include <conio.h>
#include <iostream>
using namespace std;
class Dreptunghi {
int lungime, latime;
public:
// metode definite in corpului clasei
void setLungime (int L)
{
lungime = L;
}
void setLatime (int l)
{
latime = l;
}
int arie (void);
};
/* metoda care urmeaza este definita in afara corpului clasei */
int Dreptunghi::arie (void)
{
return lungime * latime;
}
int main()
{
Dreptunghi dr;
dr.setLatime(10);
dr.setLungime(20);
cout << "arie: " << dr.arie() << endl;
_getch();
return 0;
}
Ieire
arie: 200
n afara corpului clasei, n definirea metodei arie(), se observ utilizarea unui operator nou,
numit operator de rezoluie, fiind simbolizat prin dou perechi de dou puncte ( :: ). Acest operator
arat domeniul (n cazul de fa clasa), cruia i aparine metoda. Menionm c este obligatorie
utilizarea operatorului de rezoluie pentru definirea unei metode n afara clasei. Declaraia (prototipul)
metodei definite n afara clasei, trebuie s fie n mod obligatoriu n corpul clasei.
Remarcm definiiile metodelor setLungime(int) i setLatime(int)care au fost incluse
direct n corpul clasei Dreptunghi, datorit faptului c acestea sunt foarte simple.
Membrii lungime i latime au modul de acces privat. Declarandu-i privai, interzicem
accesarea lor direct de ctre orice funcie din afara clasei. Iniializarea cmpurilor din interiorul
obiectului este posibil, deoarece am definit metodele membru setLungime(int) i
setLatime(int), care seteaz valorile cmpurilor lungime i latime. Datorit lor, n restul
programului, nu este necesar (dar nici posibil) s se acceseze direct cmpurile clasei.
Observaie
n cadrul exerciiilor ce vor fi rezolvate la laboratorul de POO, toate declaraiile de clase se vor
face n fiierele antet (header), la fel ca i declaraiile de alte tipuri. Tot aici vom declara i eventualele
funcii globale. Definiia metodelor se va face n fiierul (fiierele) .cpp asociate antetului.
Ieire
arie obiect dr: 200
arie obiect drept: 30
n acest caz, avem dou instane de tip Dreptunghi: dr i drept. Fiecare obiect are propriile
valori pentru cmpuri i poate accesa metodele clasei. Se explic astfel de ce rezultatele sunt diferite,
dei este apelat aceeai metod: arie().
3. Referine
n C++ o funcie poate primi parametri n dou feluri prin valoare sau prin referin.
Transmiterea parametrilor prin valoare este cea obinuit, cunoscut pn acum din limbajul C. Un
parametru transmis prin valoare, dac este modificat n funcie, nu i va pstra valoarea modificat n
funcia apelant. De exemplu, n programul de mai jos, funcia schimba() este greit i nu va avea nici
un efect asupra parametrilor primii:
/*exemplu eronat cu transmiterea parametrilor prin valoare */
#include<conio.h>
#include<iostream>
using namespace std;
void schimba(int a, int b) {
int aux = a;
a = b;
b = aux;
}
int main() {
int a = 2, b = 3;
cout << a << " " << b << endl;
schimba(a,b);//a si b raman neschimbate
cout << a << " " << b << endl;
_getch();
return 0;
}
Ieire:
2 3
2 3
ns n limbajul C++, putem s transmitem parametrii prin referin. n acest caz, modificrile
efectuate n funcie, asupra parametrilor, vor rmne i n funcia apelant. Pentru a transmite un
parametru prin referin, n declaraia funciei vom pune operatorul & n faa numelui parametrului. De
exemplu, funcia schimba() cu parametri referin va fi declarat astfel:
void schimba(int &a, int &b);
Putem utiliza o astfel de funcie ntr-un algoritm de sortare, n locul funciei cu pointeri
cunoscute din semestrul trecut, de la Programarea Calculatoarelor:
4. Exerciii
1. S se scrie o clas Punct care reprezint un punct din plan. Clasa va conine:
void extrage(int) care extrage un element din mulime. n cazul n care elementul
nu este prezent, mulimea rmne neschimbat;
m.extrage(4);
m.afisare();
m.adauga(9);
m.adauga(2);
m.afisare();
_getch();
return 0;
}
Metoda va folosi ziDinSaptamana(). S se afieze datele citite n toate cele trei formate.
3.4
S se adauge metoda int diff(Data data2) care
returneaz diferena n zile dintre data curent i data pstrat n parametrul data2. Aceast diferen
poate fi un numr negativ, 0, sau un numr pozitiv. Pentru simplitate putei considera toi anii nebiseci.
S se sorteze datele n ordine cresctoare i s se
afieze diferenele dintre oricare dou date consecutive.
De exemplu, pentru datele citite:
03.09.2007
03.09.2008
21.10.2008
Rezultatul va fi:
3 septembrie 2007, miercuri
peste 365 zile
3 septembrie 2008, miercuri
peste 48 zile
21 octombrie 2008, marti