You are on page 1of 31

Proiectare şi programare orientă pe obiecte

Obiective
1. Prezentarea conceptelor fundamentale ale programării orientate pe
obiecte: clase, obiecte, mesaje, încapsulare, ierarhie de clase, legare
dinamică a metodelor, polimorfism
2. Crearea deprinderilor de modelare si proiectare orientata pe obiecte
3. Familiarizarea cu limbajele de specificare a sistemelor orientate pe
obiecte (UML)
4. Însusirea tehnicilor de programare orientată pe obiecte în C++ si Java
5. Cunoasterea metodologiilor de analiză, de programare orientata pe
obiecte si testare a sistemelor reale

Page | 1
Tematica de curs
1. Principii ale proiectarii si programarii orientate pe obiecte
2. Concepte de bază ale limbajului C++ (sau cum se trece de la C la C++):
 Aspecte lexicale, Declaraţii şi Definiţii, Tipuri fundamentale/derivate,
 Referinţe, Pointeri, Argumente implicite ale funcţiilor,
 Supraincărcarea funcţiilor, Clase şi operatori, Precedenţa operatorilor,
 Expresii. Convenţii. Fişierele unui program C++.
3. Clase şi obiecte:
 Date şi funcţii membre, Clase, Structuri şi Uniuni,
 Constructori şi Destructori, Clase locale, Clase imbricate
 Funcţii şi Clase Friend. Alocarea dinamică a obiectelor.
4. Sistemul I/O din C++
5. Functii de conversie si constructorii de copiere. Supraincărcarea operatorilor
6. Clase derivate. Moşteniri
7. Polimorfism, functii virtuale
8. Programare generica. Clase şi funcţii template
9. Tratarea exceptiilor
10. Biblioteca STL, containere, iteratori

Laborator
1. Laboratorul este obligatoriu
2. Exercitii rezolvate cu grad de dificultate de la simplu la complex
3. Teme de rezolvat acasa
4. Prezentari de teme

Page | 2
Bibliografie

1. Kris Jamsa, Lars Klander – Totul despre C si C++, Ed. Teora, 2000
2. Bruce Eckel – Thinking in C++, Prentice Hall Inc., 2000
3. Herbert Schildt – C++ Manual complet, Ed. Teora, 1998
4. Bjarne Stroustrup – The C++ Programming Language, Third Edition, Addison Wesley
Longman, Inc., 1997
5. Dorin Mircea Popovici, Ioan Mircea Popovici, Iusti Tanase – Tehnologia orientată pe
obiecte. Aplicatii, Ed. Teora, 1996

Page | 3
Lectia1 - Introducere în programarea orientată obiect
Ce este PPOO?
Orice program poate fi perceput ca o colecŃie de date şi de operaŃii care se
execută asupra datelor. În programarea procedurală aceste două elemente sunt
tratate separat, reprezentarea datelor se realizează cu ajutorul tipurilor de date
iar reprezentarea operaŃiilor se face prin funcŃii şi proceduri.

Folosirea funcŃiilor nu este suficientă dacă se doreşte o descriere şi


implementare eficientă a unor algoritmi ce necesită structuri de date complexe
în rezolvarea problemelor.

Page | 4
În plus, dacă se doreşte reutilizarea unor programe scrise anterior în rezolvarea
unor noi probleme va fi necesar un efort considerabil din partrea
programatorului să adapteze codul sursă reutilizat la noile nevoi iar aceasta va
duce la apariŃia a numeroase erori. Din acest motiv este mult îngreunat şi lucrul
în echipă, dacă un programator trebuie să implementeze o funcŃie, acesta va
trebui să studieze şi celelalte module ale programului.

Un limbaj de programare potrivit acestor sarcini ar trebui să permită atât


încapsularea structurilor de date cât şi a funcŃiilor care operează cu aceste
structuri ca o singură entitate, să permită ascunderea detaliilor de
implementare a operaŃiilor şi să permită reutilizarea şi extinderea unor module
existente (chiar şi a celor compilate – fără recompilare).

In cazul PPOO un program reprezinta o colectie de obiecte care interactioneaza


intre ele. Obiectele din program modeleaza obiecte din lumea reala. Un obiect
in memorie poate fi reprezentat clase – adica un set de date si un numar de
functii care opereaza asupra datelor, definite impreuna.

Page | 5
S-a impus astfel, nevoia unui model de programare capabil să depaşească
limitările programării structurate şi care să permită realizarea unei abstractizări
adecvate a datelor şi a operaŃiilor în aşa fel încât să permită o tratare unitară a
acestora.
Aşa s-a născut clasa limbajelor de programare orientate pe obiecte din care face
parte şi limbajul C++.
Programarea orientată pe obiecte – POO - (object-oriented programming) este o metodă
de programare în care programele sunt organizate sub formă de colecŃii de obiecte care
conlucrează între ele, fiecare dintre acestea reprezentând o instanŃă a unei clase, iar
clasele sunt membre ale unei ierarhii de clase, corelate între ele prin relaŃii de moştenire.

Page | 6
Modelul de programare orientată pe obiecte rezolvă aceste probleme având la
bază următoarele principii importante: abstractizare, încapsulare, modularizare,
moştenire şi polimorfism.

Page | 7
Principii fundamentale în programarea orientată pe obiecte
Abstactizarea
Abstractizarea înseamnă identificarea similitudinilor între diferite entităŃi, situaŃii
sau procese din lumea reală şi decizia de a se concentra atenŃia asupra acestor
aspecte comune şi ignorarea pentru început a celorlate aspecte.

Abstractizarea este un model în care un obiect este privit prin prisma metodelor
(operaŃiilor) sale, ignorându-se pentru moment detaliile de implementare a acestora. O
bună abstractizare va defini în mod clar graniŃele conceptuale ale obiectului, va scoate în
evidenŃă doar aspectele semnificative ale obiectului, acelea care fac ca acesta să se
diferenŃieze de alte obiecte şi va estompa celelalte caracteristici.

Aşadar, în procesul de abstractizare atenŃia este îndreptată spre aspectul exterior al unui
obiect, spre modul său de comportare şi nu spre felul în care această comportare este
implementată. Comportarea unui obiect se caracterizează printr-un număr de servicii sau
resurse pe care acesta le pune la dispoziŃia altor obiecte. MulŃimea operaŃiilor unui obiect
împreună cu regulile lor de apelare constituie interfaŃa obiectului.
Programatorii utilizează abstractizarea pentru a simplifica analiza, proiectarea şi
implementarea programelor complexe. În programarea orientată pe obiecte instrumentul
de bază pentru abstractizare este clasa.

Page | 8
Încapsularea
Încapsularea este procesul de compartimentare a elementelor unei
abstractizări (a unui model) în două părŃi: structura internă şi
comportarea. Încapsularea permite separarea comportării (accesată
printr-o interfaŃă) de structura interna definită prin implementare.

Încapsularea este conceptul complementar abstractizării. Dacă rezultatul


operaŃiei de abstractizare pentru un anumit obiect este identificarea interfeŃei,
atunci încapsularea trebuie să definească reprezentarea (structura) internă a
obiectului şi să selecteze o implementare a interfeŃei acestuia. Prin urmare,
încapsularea este procesul în care are loc separarea interfeŃei de implementare şi
ascunderea implementării faŃă de exterior.

Separarea interfeŃei de reprezentarea unui obiect şi de implementarea metodelor


sale permite modificarea structurii obiectului şi a metodelor fără a afecta în nici
un fel programul care foloseşte obiectul, întrucât acesta depinde doar de
interfaŃă. Încapsularea permite modificarea programelor într-o manieră
eficientă, cu un efort limitat si bine localizat.

Page | 9
Tipizarea (typing)
Tipul este o caracterizare precisă, structurală şi comportamentală a unei
colecŃii de entităŃi. Deşi conceptul tipul este similar conceptului de clasă,
tipizarea se referă la un element diferit al modelului obiect de cât cel la
care se referă clasele. Tipizarea este o accentuare a clasei unui obiect, astfel
încât obiecte de clase diferite nu pot fi intershimbate între ele sau, cel mult,
pot fi interschimbate într-un mod foarte restrictiv.

Page | 10
Modularizarea
Modularizarea este procesul de partiŃionare a unui program în
componente individuale (module) ceea ce permite reducerea complexităŃii
programului prin definirea unor graniŃe bine stabilite şi bine documentate
în program.

Clasele obŃinute în urma abstractizării şi încapsulării trebuiesc grupate şi apoi


stocate într-o formă fizică, denumită modul. Modulele pot fi privite ca fiind
containerele fizice în care declarăm clasele şi obiectele rezultate în urma proiectării
la nivel logic. Modulele formează aşadar arhitectura fizică a programului.
Modularizarea constă în divizarea programului într-un număr de module care vor fi
dezvoltate şi compilate separat, dar care sunt conectate între ele. Scopul
descompunerii în module este reducerea costurilor prin posibilitatea de a proiecta,
dezvolta, testa şi revizui părŃi ale programului într-un mod independent.
Concret, în C++ modulele sunt fişiere ce se compilează separat. În practică se
obişnuieşte ca interfaŃa unui modul să fie plasată într-un fişier header (cu extensia
“.h”), în timp ce implementarea acestuia se va regăsi într-un fişier sursă (cu extensia
“.cpp”). DependenŃele dintre module vor fi exprimate utlizând directivele de tip
“#include”.

Page | 11
Moştenirea
Moştenirea este o modalitate de a ordona abstactizările (tipurile abstacte
de date, clasele). Prin moştenire se crează o ierarhie de tipuri existând o
relaŃie dintre aceste tipuri.

Nu de puŃine ori, scriind programe în maniera clasică, eram puşi în situaŃia de a


adapta sau rescrie funcŃii scrise anterior. Această etapă de implementare
consuma mai mult timp decât era necesar şi, în plus, exista riscul apariŃiei de
numeroase erori. O variantă mult îmbunătăŃită de reutilizare a codului este
moştenirea. Moştenirea este unul dintre cele mai importante concepte ale
limbajelor de programare pe obiecte. Aceasta permite extinderea obiectelor
existente şi construirea de noi obiecte într-un mod simplu. Astfel, o clasă poate
moşteni toate caracteristicile uneia sau a mai multor clase create anterior la care
poate adăuga trăsături noi şi, în anumite condiŃii, poate redefini unele din
metodele moştenite.

Page | 12
Polimorfismul
Tehnica ce vine in ajutorul abstractizării care prmite utilizarea unor tipuri
abstracte de date in proiectarea programelor astfel încât obiectele cu care
lucreaza programul pot si substituite cu altele sau se pot adăuga obiecte noi
cu aceeaşi “formă“ fără modificarea sau recompilatea programului.

Polimorfismul este o facilitate a programării orientate obiect care oferă


instanŃelor unor clase de a reacŃiona într-un mod specific la un mesaj (la un apel
de funcŃie). Spre exemplu, într-o ierarhie de clase obŃinută prin moştenire, care
reprezintă forme geometrice (puncte, linii, dreptunghiuri, cercuri) fiecare obiect
are o funcŃie Draw(). Apelul acestei funcŃii printr-o referinŃă la un obiect grafic
generic trebuie să se comporte corespunzător obiectului referit.

Page | 13
Concurenţa
ConcurenŃa permite ca mai multe obiecte diferite să fie în execuŃie în
acelaşi timp.

Persistenţa
Un obiect aflat în memorie ocupă un anumit spaŃiu în memorie şi are o
existenŃă într-o perioadă determinată de timp din timpul de execuŃie al
programului. Utilizând mecanisme specializate care asigură persistenŃa,
obiectele pot fi salvate în fişiere sau in baze de date şi pot fi reincărcate mai
târziu în altă sesiune a programului.

Page | 14
Compilarea unui program in C++

Page | 15
Identificatori şi cuvinte cheie în limbajul C++
Un identificator este o secvenŃă de lungime oarecare de litere şi cifre, cu
condiŃia ca primul caracter să fie literă sau caracterul de subliniere _
(underscore). Literele mici sunt diferite de literele mari corespunzătoare.
Următorii identificatori sunt rezervaŃi pentru a fi utilizaŃi de limbaj şi nu pot
avea altă utilizare.

32 cuvinte cheie din limbajul C

auto const double float int short struct unsigned


break continue else for long signed switch void
case default enum goto register sizeof typedef volatile
char do extern if return static union while

30 cuvinte rezervate adaugate de C++:


asm dynamic_cast namespace reinterpret_cast try
bool explicit new static_cast typeid
catch false operator template typename
class friend private this using
const_cast inline public throw virtual
delete mutable protected true wchar_t

11 cuvinte rezervate in C++


and bitand compl not_eq or_eq xor_eq
and_eq bitor not or xor

Page | 16
Clase şi obiecte
Ce este o clasa ? In limbajele de programare orientate pe obiecte se introduce conceptul de clasa, prin acceasta datele sunt definite impreuna cu
functiile care le prelucrează.

O clasă este un model simplificat al unui obiect din lumea reala.

O clasă reprezinta o definitie, un model pe baza caruia se vor crea obiecte. Prin definirea unei clase definim un nou tip de date, pe baza
acestui tip de date se pot defini variabile din program, aceste variabile reprezintă obiectele din program. Un obiect este reprezentat
printr-un set de date numite atribute şi un numar de functii numite metode.

Conceptul fundamental din programarea orientată pe obiecte îl reprezintă notiunea de clasă ca tip de date definit de utilizator. Cuvântul cheie
class ne permite să intrăm în universul programării orientate pe obiecte, cu ajutorul lui putem defini tipuri abstracte de date. Variabilele declarate
pe baza unui tip abstract se numesc obiecte sau instanŃe ale clasei. Putem spune că:

Clasa = Date + Operaţii


Clasa = Atribute + Metode

Spre deosebire de structurile cunoscute din limbajul C, clasele conŃin nu numai date membre (numite şi atribute) ci şi funcŃii membre (care se mai
numesc şi metode), constructori, un destructor şi o serie de operatori. Aceste funcŃii operează asupra datelor obiectului căruia îi aparŃin.

Page | 17
Definirea claselor
În general o clasă se defineşte astfel:

class nume
{
private:
<atribute membre private>
<constructori privati>
<metode private>
protected:
<atribute membre protejate>
<constructori protejati>
<metode protejate>
public:
<atribute membre publice>
<constructori publici>
<destructor public>
<metode publice>
};

Pentru exemplificare vom defini o serie de clase pentru reprezentarea figurilor


geometrice în plan. Se ştie că figurile geometrice se contruiesc pornind de la
unele forme simple cum sunt punctul, linia… Urmează un exemplu de
declaraŃie de clasă care introduce un tip nou de date numit Punct.

Page | 18
O clasa este formata din doua parti: declaratia sau interfata clasei si definitia
sau implementarea acesteia.
Interfata de obicei se introduce in fisiere header (*.h), iar definitia se va
scrie in fisiere de implementare (*.cpp).

Exemplu

//Persoana.h //persoana.cpp
class Persoana #include ”persoana.h”
{ #include<iostream>
char nume[20]; Persoana::afisare()
int varsta; {
public: std::cout<<nume<<“ “<<nume<<std::endl;
void citire(); }
void afisare();
};
Page | 19
Exemplu
//fişierul Point.h
class Point
{
protected:
int x, y; //atribute
public:
Point(); //constructor
Point(int, int); //consructor
~Point(); //destructor
void Print(); //funcŃie membra, metodă
void Read(); //funcŃie membra, metodă
};

//fişierul Point.cpp
#include<iostream>
using namespace std;

Point::Point()
{
x = y = 0;
}
Point::Point(int x0, int y0)
{
x = x0;
y = y0;
}
Point::~Point()
{}
void Point::Print()
{
cout<<x<<” ”<<y<<endl;
}
void Point::Read()
{
cout<<”x = ”; cin>>x;
cout<<”y = ”; cin>>y;
}

Page | 20
Atribute si metode
Datele definite intr-o clasa se numesc atributele clasei, functiile membre ale
unei clase poarta numele de metode. In cazul nostru datele x si y sunt atribute,
functiile Read si Print sunt metode.

Page | 21
Constructorii
În limbajul C++ constructorii sunt funcŃii membre speciale care asigură crearea şi distrugerea
corectă a obiectelor. Constructorul unei clase este prima metodă care este apelată la declararea unui
obiect, imediat după alocarea memoriei necesare datelor membre. Constructorul este apelat imediat
ce o variabilă intră în domeniul ei de vizibilitate, adică atunci când execuŃia unui program "atinge"
instrucŃiunea în care aceasta este declarată. Un constructor poate indeplini o mare varietate de
sarcini, ca de exemplu iniŃializarea variabilelor interne, alocări dinamice de memorie, deschidere de
fişiere, etc.
Avem următoarele reguli privind constructorii:
• numele unui constructor trebuie să fie identic cu numele clasei;
• constructorii nu returnează nimic, nici măcar tipul void;
• constructorul poate apela alte funcŃii membre sau nu;
• constructorul nu poate fi virtual;
• constructorul, ca orice altă metodă poate fi supraîncărcat, pot să există deci mai mulŃi constructori într-o clasă, având acelaşi nume cu
numele clasei dar deosebindu-se prin lista de parametrii formali;
• clasă poate avea oricâŃi constructori, inclusiv nici unul, dacă nu s-a declarat nici un constructor compilatorul generează un constructor
implicit, public, fără parametrii;
• constructorul implicit, folosit fără parametrii la iniŃializarea obiectelor, dacă este definit, trebuie să fie definit fără parametrii sau să
folosească valori prestabilite ale parametrilor formali;
• în mod normal constructorii sunt declaraŃi ca fiind publici, în cazuri speciale aceştia pot fi declaraŃi private şi nu vor putea fi apelaŃi
decât din cadrul altor funcŃii membre sau de tip friend, clasele din această categorie se numesc clase private;
• dacă o clasă conŃine date membre constante sau referinŃe la obiecte, atunci constructorul trebuie scris în aşa fel încât să iniŃializeze
referinŃele înaintea celorlalte date membre;
• constructorul de copiere iniŃializează un obiect printr-o operaŃie de copiere a datelor dintr-un obiect existent, având o referintă la
acesta;
• dacă în cadrul unei clase nu este declarat un constructor de copiere, compilatorul crează unul implicit;
• se recomandă definirea unui constructor de copiere în special în cazul în care se lucrează cu clase care manevrează structuri de date
dinamice, aceşti constructori realizează o copie profundă a obiectelor, care implică şi datele alocate dinamic, în timp ce constructorul
de copiere introdus de compilator realizează o copie superficială a obiectelor, copiind doar datele membre ale claselor bit cu bit.

Page | 22
Exemplu:
//fişierul Circle.h
#include "Point.h"
#define pi 3.14159265

class Circle
{
public:
Circle(){radius = 0;}
Circle(int r){radius = r;}
Circle(int x, int y, int r){ Set(x,y,r);}
Circle(Circle&);
float Area(){ return pi * radius * radius;}

protected:
Point center;
int radius;
public:
void Read();
void Print();
void Set(int, int, int);
};

//fişierul Circle.cpp
#include "Circle.h"

Circle::Circle(Circle &a)
{
center = a.center;
radius = a.radius;
}
void Circle::Set(int x, int y, int r)
{
center.Set(x,y);
radius = r;
}
void Circle::Read()
{
center.Read();

Page | 23
cout<<"Raza = "; cin >> radius;
}
void Circle::Print()
{
cout<<”Circle:”<<end;
center.Print();
cout<<"Radius = "<<radius<<endl;
}

Page | 24
Destructorul
Destructorul este elementul care dezactivează toate funcŃiile unui obiect înainte de eliberarea memoriei ocupate de acesta. Destructorii ca şi
constructorii pot efectua orice fel de operaŃii, dar de obicei sunt utilizaŃi în clase care manevrează structuri de date alocate dinamic sau care
operează cu fişiere sau cu fluxuri de comunicaŃie. Destructorul este apelat ori de cite ori se "atinge" punctul final al domeniului de vizibilitate al
unei variabile, ca de exemplu: întoarcerea dintr-o funcŃie, terminarea unei bucle (pentru variabilele automatice declarate în interiorul unei bucle,
etc). Perioada dintre momentul creării unei variabile şi momentul distrugerii sale se numeste "durata de viaŃă".

Limbajul C++ dispune de urmatoarele reguli de folosire a destructorilor:


• numele destructorului trebuie să fie identic cu cel al clasei care îl conŃine şi trebuie să fie precedat de caracterul tilda “~”;
• destructorul nu returnează nici un tip de date, nici măcar void;
• destructorul nu poate avea parametrii;
• orice clasă nu poate avea mai mult de un destructor, dacă pentru o clasă nu este precizat nici un destructor atunci compilatorul crează
un destructor implicit pentru clasa respectivă;
• dacă un obiect conŃine ca date membre alte obiecte atunci destructorii obiectelor membre sunt apelaŃi după ce destructorul clasei a
fost executat, ordinea în care sunt distruse componentele este inversă faŃă de cea în care au fost create (ordinea din declaraŃia clasei);
• în timpul execuării programului este apelat automat destructorul obiectelor a căror durată de viaŃa a expirat.
• Astfel, durata de viaŃă a obiectelor este:
• obiectele automatice: sunt locale unei funcŃii şi de aceea sunt păstrate (create şi utlizate) pe stivă, acestea există atâta timp cât "există"
funcŃia, se crează în prologul funcŃiei şi se distrug în epilogul acesteia de către destructor;
• obiectele statice: sunt declarate în afara funcŃiilor sau în interiorul funcŃiilor cu ajutorul cuvântului cheie static, acestea sunt create la
începutul programului şi există pe întreaga durată de execuŃie a programului, la terminarea programului se apelează destructorul
fiecărui obiect static;
• obiecte dinamice: sunt utilizate prin alocare de memori din heap – o zona de memorie specială, sunt create cu operatorul new şi sunt
eliberate explicit cu operatorul delete, pot exista şi după terminarea funcŃiei în care au fost create cu operatorul new, nu sunt eliberate
automat;
• obiecte membre ale altor obiecte sunt create/distruse atunci când obiectul căruia îi aparŃin este creat/distrus.

Page | 25
Declaraţii de obiecte. Instanţieri
În limbajele de programare un loc central îl ocupă conceptul de tip de date. Fiecare variabilă care este prelucrată într-un program este de un
"anumit tip" predefinit sau definit de programator. În limbajele de programare orientate obiect tipurile de date definite de programator, sau clasele
- tipurile abstracte, sunt mai importante. Declararea unei variabile de un anumit tip abstract se numeşte instanŃiere iar variabilele se numesc
obiecte sau instanŃe ale clasei. Sintaxa este asemănatoare cu cea a declaraŃiilor de variabile.

//Fisierul program.cpp
#include "Point.h"
#include "Circle.h"

int main(void)
{
Point A, B(1,2);
Point C = Point(3,3);
A.Set(10,5);
A.Print();
A = C;
A.Print();
Circle C1,C2(10);
Circle C3 = Circle(10,10,10);
Circle C4(C3), C5 = C4;

C1.Read();
C1.Print();
C5.Print();
return 0;
}

Page | 26
Modificatori de access
Încapsularea nu presupune numai simpla combinare a metodelor şi a datelor ca o
singură entitate ci şi o posibilitate de a limita accesul la datelor şi metodelor
membre ale unei clase mai ales în situaŃii în care se doreşte prevenirea modificării
accidentale a datelor aparŃinând unui obiect. În cadrul declarării unei clase, prin
folosirea unor modificatori de acces, se poate preciza unul din cele trei niveluri de
acces la datele şi metodele clasei, astfel:
 private – este modul implicit, membrii de acest tip sunt accesibili numai
metodelor membre şi a funcŃiilor de tip friend, aceste elemente sunt considerate
proprii, intime clasei în care au fost declarate şi nu vor fi accesibile în clasele
derivate;
 protected – este similar modului private, în plus membrii sunt accesibili şi în
metodele claselor derivate (în cazul moştenirii publice), acest modificator este
recomandat să se folosească în clasele ce urmează să fie extinse;
 public – toate atributele şi metodele publice pot fi accesate sau apelate din orice
punct din program exterior clasei, unde este cunoscută clasa.
Trebuie să reŃinem că limbajul C++ nu impune o anumită ordine de folosire a
acestor modificatori iar atributele şi metodele fără modificator de acces sunt
considerate private. SecŃiunile unei clase pot apărea de mai multe ori în cadrul
declaraŃiei unei clase. În cele mai multe situaŃii datele membre se vor plasa în
secŃiunile protejate pentru a permite accesul acestora din cadrul claselor derivate.
Page | 27
De asemenea se recomandă evitarea plasării datelor în secŃiunea publică. Se recomandă folosirea funcŃiilor
membre pentru iniŃializarea şi prelucrarea datelor membre. Clasele pot avea mai mulŃi constructori (de
obicei publici) şi cel mult un destructor public.

În cazul nostru metodele care urmează imediat după cuvântul public sunt publice, cu alte cuvinte acestea
pot fi accesate din exterior oriunde în program unde clasa Point este accesibilă. Domeniul de vizibilitate al
atributelor şi metodelor este este acelaşi cu domeniul de vizibilitate al clasei.

Deoarece declaraŃia lui C1 nu specifică nici un argument compilatorul apelează constructorul fără
parametrii, C2 se va iniŃializa cu ajutorul constructorului cu doi parametrii, instanŃa C4 va fi o copie lui C3
(primit ca argument), deci pentru C4 se va utiliza constructorul de copiere.

O altă metodă de iniŃializare foloseşte listele de instanŃiere. O astfel de listă conŃine a membrilor clasei ce
urmează a fi iniŃilizaŃi şi se plasează între lista de parametrii a costructorului şi corpul acestuia. Listă este
formată din constructori cu parametrii specifici, câte unul pentru fiecare membru ce trebuie iniŃializat în
acest mod. Această metodă este singura care se poate folosi la iniŃializarea clasei ce conŃine date membre
constante, referinŃe la obiecte sau obiecte fără constructor implicit public. Un aspect important legat de
listele de instanŃiere este ordinea în care se face iniŃializarea în cadrul acesteia, mai ales dacă la
iniŃializarea unor membrii se folosesc valorile altora.
Ordinea de instanŃiere a datelor membre este dată întotdeauna de ordinea în care datele apar în
declaraŃia clasei şi nu de ordine acestora din lista de instanŃiere.

Dacă un obiect membru conŃine în declaraŃia clasei sale un constructor implicit atunci acest obiect poate
lipsi din lista de instanŃiere. În cazul în care un membru al unei clase este un pointer la un obiect atunci nu
putem iniŃializa pointerul în cadrul listei de instanŃiere, constructorii nu pot fi apelaŃi pentru pointeri la
obiecte (în această listă) ci numai pentru obiecte şi referinŃe.

Page | 28
Exemplu
//fişierul Rectangle.h
#include "Point.h"
class Rectangle
{
protected:
Point A, B;
public:
Rectangle(){ }
Rectangle(int x1,int y1,int x2,int
y2):A(x1,y1),B(x2,y2){ }
Rectangle(Point &a, Point &b ):A(a), B(b){ }
Rectangle(Rectangle & r):A(r.A), B(r.B){ }
int Area(){return (B.x-A.x)*(B.y-A.y);};
};

Page | 29
Declararea tablourilor de obiecte
Aşa cum construim tablouri sau matrici de structuri în limbajul C, tot aşa putem
construi tablouri sau masive de obiecte. Iată, de exemplu, cum putem defini un
triunghi:

Point triunghi[3];
Pentru fiecare element al tabloului se va apela constructorul implicit. Triunghiul
poate fi iniŃializat aşa cum se iniŃializează tablourile de structuri dacă obiectele
componente conŃin doar membrii publici, nu conŃin metode virtuale şi nu provin din
clase derivate.

Point triunghi[3] = {{0,0},{0,3},{4,0}};

În alt mod de iniŃializare a tabloului poate folosi lista de constructori într-un mod
asemănător cu utilizarea listei de instanŃiere, iniŃializarea tabloului poate fi parŃială
deoarece pentru restul elementelor se apelează constructorul implicit:
Point triunghi[10] = {Point(), Point(0,3), Point(4,0)};

Page | 30
Bibliografie

1. Kris Jamsa, Lars Klander – Totul despre C si C++, Ed. Teora, 2000
2. Bruce Eckel – Thinking in C++, Prentice Hall Inc., 2000
3. Herbert Schildt – C++ Manual complet, Ed. Teora, 1998
4. Bjarne Stroustrup – The C++ Programming Language, Third Edition, Addison
Wesley Longman, Inc., 1997
5. Dorin Mircea Popovici, Ioan Mircea Popovici, Iusti Tanase – Tehnologia
orientată pe obiecte. Aplicatii, Ed. Teora, 1996

Page | 31

You might also like