Sunteți pe pagina 1din 13

Programare orientat obiect

Lucrarea de laborator Nr. 1


MEDIUL DE DEZVOLTARE DEVELOPER STUDIO.
ELEMENTELE DE BAZ ALE UNUI PROIECT
Programarea orientat pe obiecte este o metod de programare n care programele sunt
organizate ca i colecii de obiecte cooperante, fiecare dintre ele reprezentnd o instan a unei
clase, iar clasele sunt membre ale unei ierarhii de clase, corelate ntre ele prin relaii de
motenire.
Limbajul C++ este unul dintre cele mai utilizate limbaje de programare orientate pe
obiecte; compilatoare, biblioteci i instrumente de dezvoltare a programelor C++ sunt disponibile
att pentru calculatoarele personale ct i pentru cele mai dezvoltate sisteme i staii de lucru.
n cadrul laboratorului de POO se va folosi Microsoft Visual C++ 9.0 rulnd sub sistemul
de operare Windows XP.
n aceast lucrare de laborator, vei ncepe s nvai cteva dintre conceptele de baz ale
limbajului C++ i vei crea un program simplu n mod consol.
Programele scrise folosind Visual C++ sunt compilate ceea ce nseamn c un fiier text
denumit fiier surs este convertit ntr-un program de sine stttor care poate fi rulat n afara
mediului Visual C++. Aproape toate sistemele de dezvoltare C++ compileaz programe
executabile. Unele limbaje de programare, cum ar fi anumite versiuni de BASIC, creaz
programe care pot rula numai n mediul de dezvoltare. Alte limbaje, cum ar fi Smalltalk, ruleaz
n corelaie cu o bibliotec de rulare, care asist programul aflat n execuie. Dimpotriv,
programele scrise folosind Visual C++, pot fi scrise i compilate ntr-un program executabil.
Acel program poate fi apoi executat pe orice calculator care dispune de un sistem de operare
Windows.
n majoritatea sistemelor de dezvoltare C++, un program C++ parcurge mai multe etape
pn la transformarea sa ntr-un program executabil:
Se creaz unul sau mai multe fiiere surs, care conin textul unui program C++ (fiiere
cu extensia .cpp).
Se compileaz programul folosind un compilator de C++. Aceast etap poate consta, de
fapt, din mai multe comenzi de compilare a fiierelor surs n fiiere intermediare,
cunoscute i sub numele de fiiere n cod obiect object code (fiiere cu extensia .obj).
Fiierele n cod obiect sunt legate la un loc folosind un instrument denumit program de
editare a legturilor linker.
Acum se poate lansa programul executabil (fiier cu extensia .exe).
Cu ceva timp n urm, majoritatea sistemelor de dezvoltare pretindeau ca fiecare din aceste
etape s fie executat fie cu produse separate, din linia de comand, fie cu ajutorul unui
instrument care determin fiierele care necesit actualizarea. Folosind instrumente moderne,
precum Visual C++, alctuirea unui program este cu mult mai simpl. Mediul Visual C++
permite editarea, compilarea, executarea i depanarea unui program n interiorul aceluiai mediu.
Toate etapele prezentate mai sus sunt supervizate de mediul de dezvoltare Visual C++ (ntlnit i
sub acronimul IDE Integrated Development Environment, sau Developer Studio sau Visual
Studio), ceea ce permite utilizatorului s se concentreze asupra scrierii programului, n loc de a
da atenie unei mulimi de detalii.

1. Microsoft Visual C++ 9.0


Lansarea mediului Visual C++ se poate face accesnd Shortcut-ul de pe Desktop care este
nsoit de icon-ul ce simbolizeaz semnul infinit n culorile rou, galben, verde i albastru

Programare orientat obiect

(MSDEV Microsoft Developer Studio). La lansarea mediului Visual C++ este afiat fereastra
Visual Studio. Visual Studio este numele dat interfeei cu utilizatorul a lui Visual C++ i va
reprezenta suprafaa de lucru.
Visual Studio este numele
dat interfeei cu utilizatorul a lui
Visual C++, interfa ce arat
conform figurii 1.
Cnd se folosete Visual C+
+ pentru dezvoltarea unui program,
majoritatea activitii este privit
drept un proiect. Fiecare proiect
stocheaz informaia necesar
crerii unui program n C++. n
funcie de tipul i de complexitatea
programului, proiectul se poate
reduce la cteva fiiere sau poate
include sute de fiiere.
Creai un proiect astfel:
Fig.1.1. Fereastra Visual Studio
Selectai comanda New a meniului File pentru a crea un nou proiect; caseta de dialog New va
fi afiat.
Specificai tipul proiectului pe care l creai din pagina Projects a casetei de dialog New (din
lista proiectelor posibile alegei Win32 Console Application).
n caseta Project Name din caseta de dialog New specificai numele proiectului (indicaie:
personalizai proiectele pe care le creai).
Folosii caseta Location pentru a preciza directorul n care vor fi plasate fiierele proiectului
(C:\POO\Studenti\.....). Calea afiat iniial n caseta Location depinde de opiunile exprimate
la instalarea mediului Visual C++.Pentru a modifica aceast locaie, fie editai calea explicit,
fie apsnd butonul aflat n partea dreapt a casetei Location urmrii ierarhia de directoare
pn n subdirectorul dorit. Locaia implicit se bazeaz pe numele proiectului i este
C:\Program Files\Microsoft Visual Studio\My Projects\numele proiectului.
Dup stabilirea opiunilor din cadrul casetei de dialog New, apsarea butonului OK iniiaz
generarea proiectului. n cazul unei aplicaii de tip Win32 Console Application, procesul de
generare a proiectului conine un singur pas n care trebuie s alegei ce tip de aplicaie n mod
consol vei crea. Alegei An empty project. La apsarea butonului Finish este afiat o
caset de dialog care v informeaz despre crearea unui schelet de proiect vid, adic nu vor
fi create sau/i adugate fiiere suplimentare la proiect. Este precizat de asemenea calea ctre
directorul proiectului. n acest moment, putei vizualiza urmnd aceast cale fiierele create.
nchidei mediul de dezvoltare.

2. Mediul Developer Studio


Mediul de dezvoltare Developer Studio utilizat de Visual C++ pare destul de complex la
prima vedere (peste 100 de opiuni de meniu i aproximativ tot attea butoane de pe bara de
instrumente care pot fi selectate). Multe dintre acestea conduc la casete de dialog complexe i la
pagini de proprieti care conin numeroase opiuni. Funcionalitatea att de bogat oferit de
Developer Studio este justificat de faptul c acest mediu este utilizat pe scar larg pentru a
produce aplicaii complexe, profesionale. n cadrul acestui laborator, vei nva o parte din
ntreaga funcionalitate.
Lansai din nou Visual C++. Deschidei proiectul creat anterior astfel:
Din meniul File, selectai proiectul din cadrul listei Recent Workspaces.

Programare orientat obiect

Pentru a deschide un proiect care nu figureaz n lista Recent Workspaces, selectai


Open Workspace din meniul File. Pe ecran este afiat fereastra Open Workspace n
care accesai directorul folosit pentru proiectul creat. Selectai din list fiierul care
poart numele proiectului i extensia .dsw i alegei Open.
Indiferent de metoda utilizat , proiectul ar trebui s fie acum deschis, cu titlul su afiat
n bara de titlu a ferestrei Developer Studio. Mediul de lucru a reinut unde ai rmas i afiarea
este identic cu cea de la nchiderea mediului de dezvoltare.
Afiarea cuprinde trei ferestre: cea a spaiului de lucru al proiectului, cea pentru editare i
cea de ieire.
Fereastra spaiului de lucru al proiectului n partea stng, este o fereastr andocabil.
Exist mai multe astfel de ferestre (fereastra Output n partea de jos este una dintre ele), unele
aprnd n modul depanare. Pentru a comuta ntre modul liber i modul andocabil pentru o
fereastr, efectuai un dublu click pe bara de titlu a ferestrei respective. Fereastra spaiului de
lucru al proiectului poate fi nchis prin efectuarea unui click pe butonul de nchidere, aflat n
colul dreapta sus. Redeschiderea ferestrei se realizeaz prin selectarea comenzii Workspace din
meniul View. Toate ferestrele andocabile au comportamente similare. Fereastra spaiului de lucru
al proiectului permite vizualizarea acestuia din mai multe perspective. Dup ce ai deschis
proiectul, in partea inferioar a spaiului de lucru, sunt disponibile dou pagini: ClassView i
FileView. Paginile din partea inferioar a ferestrei mpart proiectul n componente logice.
Efectuai click pe o pagin pentru a vizualiza reprezentarea corespunztoare. Fiecare
reprezentare afieaz o structur arborescent de elemente care reprezint componente ale
proiectului. Putei s expandai sau s condensai elementele arborelui efectund click pe
simbolul plus (+) sau minus (-) alturat n partea stng a acestora. Pentru c ai creat o aplicaie
n mod consol ca un proiect gol nici un fiier nu exist n acest moment n proiect i nu poate fi
vizualizat.

Exerciiul 1.
Creai alte tipuri de proiecte pentru aplicaii n mod consol i vizualizai fiierele create
de ctre mediul de dezvoltare.
Despre pagina ClassView vom discuta la momentul oportun. Pentru tipurile de proiecte
create analizai coninutul paginii FileView. Este afiat o list cu o parte din fiierele incluse n
proiect.
Fiierele sunt organizate pe cataloage n funcie de tipul acestora (cataloagele nu
reprezint locaia fiierelor pe hard disk). Efectuarea unui dublu click pe numele unui fiier
deschide fiierul n fereastra din dreapta, fereastra de editare. Facei o comparaie ntre aceast
list i coninutul directorului proiectului n care vei vedea alte cteva tipuri de fiiere. Unele
dintre acestea sunt fiiere temporare folosite de ctre Developer Studio; altele depind de tipul
proiectului i de coninutul su.
n pagina File View se pot aduga fiiere proiectului sau se pot nltura fiiere din proiect
prin selectarea numelui fiierului i apsarea tastei Delete. Aceasta duce doar la nlturarea
fiierului din proiectul Visual Studio fr a terge efectiv fiierul de pe disc.

3. Crearea unui fiier surs n C++


Cea mai important component a oricrui program n C++ o reprezint fiierele surs.
Pentru simplitate, vei lucra la nceput cu programe care conin un singur fiier surs. Dei
programul model prezentat n listingul urmtor este foarte scurt, conine o bun parte dintre
elementele existente n toate programele C++:
# include <iostream.h>
int main()

Programare orientat obiect

{
cout<<Hello, World!<<endl;
return 0;
}
Revenii la primul proiect creat. O modalitate de a deschide un fiier surs nou n vederea
editrii este urmtoarea: selectai File, apoi New din meniul principal. Din pagina Files a casetei
de dialog New care este afiat alegei opiunea C++ Source File, dai un nume noului fiier
(poate fi acelai ca al proiectului). Observai c, implicit este setat opiunea de adugare a
noului fiier proiectului curent. n fereastra de editare se deschide noul fiier. Adugai codul de
mai sus.
Compilai fiierul surs (Build Compile nume_fiier.cpp). Legai proiectul (Build
Build nume_proiect.exe). Proiectul poate fi alctuit i prin selectarea direct a comenzii Build
nume_proiect.exe, compilarea realizndu-se implicit. n fereastra de jos vor apare informaii
privind compilarea fiierelor i legarea proiectului. Dac ai introdus corect coninutul listingului
proiectul va fi creat fr erori i fr avertizri.

Exerciiul 2.
Intenionat stergei din codul programului ghilimele sau punct i virgul sau paranteze.
Compilai de fiecare dat i urmrii erorile i mesajele de avertizare. Un dublu click pe prima
linie a unui mesaj de eroare poziioneaz cursorul n fereastra de editare n dreptul liniei unde
compilatorul consider c se afl eroarea. Pot apare erori ca urmare a altor erori aa nct se
corecteaz prima eroare i apoi se recompileaz s.a.m.d.
Dup compilarea i legarea fr erori a proiectului, putei rula programul selectnd Build
Execute nume_proiect.exe din meniu.

4. Elementele de baz ale unui proiect n C++


Programul creat are multe n comun cu programe C++ de dimensiuni mult mai mari:
Prima linie din program este un mesaj ctre compilator de a include i un alt fiier
la compilarea fiierului creat. Instruciunea #include cere compilatorului s caute
fiierul iostream.h i s-l introduc n fiierul surs.
Urmtoarea linie reprezint nceputul funciei principale (main). Toate programele
n C++ constau dintr-una sau din mai multe funcii. Funcia denumit main este
locul n care ncepe execiia programului, motiv pentru care toate programele n
C++ trebuie s aib o funcie denumit main. Funcia returneaz (return) o valoare
ntreag (int) sistemului de operare la ncheierea executrii. Funcia nu accept
parametrii. Sistemul de operare folosete valoarea returnat de funcia main
pentru a afla dac programul a fost executat cu succes. Este posibil returnarea
ctre sistemul de operare a unor valori care indic reuit sau eec.

Exerciiul 3.
Pentru celelalte tipuri de proiecte pe care le-ai creat identificai funcia main deja creat
de ctre mediul de dezvoltare.
Urmtoarele 4 linii de dup int main() reprezint corpul funciei main, cunoscut i
sub numele de bloc instruciune, ncadrat ntotdeauna ntre o pereche de acolade.
n interiorul funciei main se afl o singur instruciune (care se ncheie cu ; ca
toate instruciunile din C++) care afieaz la consol o linie de caractere folosind
obiectul cout din iostream. Folosind biblioteca iostream, se simplific operaiile
de intrare/ieire pentru programul n mod consol.

Programare orientat obiect

Biblioteca iostream folosete simbolul << pentru ieiri i >> pentru intrri din, respectiv
n fluxul de date (secven de octei, fiier pe disc, datele de ieire pentru imprimant sau pentru
ecrane mod caracter, etc). O regul simpl este aceea c atunci cnd ntlnii simbolul <<,
valoarea de la dreapta simbolului va fi ieirea pentru obiectul IO din stnga iar cnd ntlnii
simbolul >>, datele din obiectul IO din stnga sunt stocate ntr-o variabil din dreapta. Cout
nseamn console output (ieire la consol) iar << poate f tradus prin pune la.
Ca o ultim observaie, cnd utilizai C++, nu uitai c deosebirea dintre literele mari i
mici este important, dar spaiile libere, cum ar fi numrul de spaii dinaintea cuvntului cout, nu
sunt importante din punctul de vedere al compilatorului. Editorul ordoneaz automat codul surs
i ofer faciliti de highlight pentru o deosebire uoar a cuvintelor cheie ale limbajului de restul
codului.
Endl (end line) indic sfrit de linie, astfel c, dup afiarea mesajului, cursorul trece la
linie nou.

Exerciiul 4.
Afiai la consol mai multe mesaje pe aceeai linie, apoi pe linii diferite.

5. Concepte de baz ale limbajului C++. Programare procedural.


Limbajul de programare C++ este o versiune extins a limbajului C al crui scop este
programarea orientat pe obiecte. C++ pstreaz eficiena, flexibilitatea i concepia de baz a
limbajului C. C++ prevede mai multe faciliti i mai puine restricii dect limbajul C, astfel
nct majoritatea construciilor din C sunt legale i au aceeai semnificaiile i n C++.
Pentru a exemplifica simplu ultima afirmaie considerm noiunea de comentariu.
Comentariile introduse ntr-un program sunt fragmente de text care sunt folosite pentru a explica,
a traduce n limbaj natural fragmente de cod de program. Nefiind cod de program comentariile
sunt ignorate de ctre compilator. n C un comentariu se introduce n program ntre perechile de
caractere /* i */, poate apare oriunde n program i se poate ntinde pe mai multe linii de
program:
/* un comentariu
n C++ */
Metoda din C poate fi de asemenea folosit n C++, dar C++ aduce o nou metod de a
introduce comentarii n program prin folosirea unui dublu slash, //, ce precede comentariul
care poate ncepe oriunde pe o linie, fiind valabil pn la sfritul liniei respective:
//un comentariu
//n C++
O bun practic de programare este de a utiliza noua metod pentru toate comentariile i
de a o folosi pe cea veche pentru a izola fragmente de cod n timpul depanrilor (se prefer
comentarea unui bloc de instruciuni din program pentru ca s nu mai fie luat n considerarea de
ctre compilator dect tergerea definitiv a liniilor de program i rescrierea lor ulterioar, dac
este cazul). Totui este bine s nu se foloseasc abuziv comentarii cnd o claritate a definiiilor
din program poate fi obinut prin denumiri sugestive a elementelor componente (variabile,
constante. funcii, etc.).

5.1. Variabile
n afar de cuvintele-cheie ale limbajului (char, const, double, else, for etc., rezervate
pentru anumite utilizri) ntr-un program se declar i se definesc entiti care servesc
algoritmului particular implementat prin program. Fiecare entitate poat un nume, care este
introdus n program printr-o declaraie. Definiia entitii rezerv cantitatea necesar de memorie

Programare orientat obiect

i execut iniializrile corespunztoare. Fiecare nume ntr-un program C++ are un tip asociat lui
care determin ce operaii se pot aplica entitii la care se refer numele.
Tipurile fundamentale n C++ sunt tipuri de ntreg, pentru definirea numerelor ntregi de
diferite dimensiuni (ca numr de octei ocupai n memorie: char 1 octet, short int 2 octei, int
2 sau 4 octei, long 4 sau 8 octei), tipuri de numere flotante, pentru definirea numerelor reale
(reprezentate ca numere cu virgul flotant: float 4 octei, double 8 octei, long double 12
sau 16 octei).
Aceste tipuri sunt denumite mpreun tipuri aritmetice. Pentru tipurile ntreg, exist
variante de declaraie cu semn (signed) i fr semn (unsigned).
Datele manipulate n cadrul unui program sunt stocate n variabile, care sunt identificate
printr-un nume i un tip. Numele pentru variabile pot fi secvene de lungime oarecare de litere i
cifre, cu condiia ca primul caracter s fie liter sau caracterul de subliniere (underscore) i cu
condiia s nu fie cuvinte cheie.
Literele mici sunt diferite de literele mari corespunztoare. n plus, cu cteva excepii pe
care le vom indica ulterior o declaraie este i o definiie. Exemple de declaraii i definiii de
variabile:
int a; // declararea i definirea de variabile sunt instruciuni, deci se ncheie cu punct i virgul (;)
int a; // eroare, redefinire; trebuie s existe o singur definiie a unei entiti n program
float real=5.7; // ntr-o declaraie a unui nume se poate introduce opional o expresie de
//iniializare pentru acel nume
float Real=5.7;
char caracter=x; // caracterul care iniializeaz o variabil de tip char este cuprins ntre
//ghilimele simple, ( )

5.2. Funcii
Programarea procedural este prima modalitate de programare care a fost i este nc
frecvent folosit. n programarea procedural accentul se pune pe descompunerea programului n
proceduri (funcii) care sunt apelate n ordinea de desfurare a algoritmului. Limbajele care
suport aceast tehnic de programare prevd posibiliti de transfer a argumentelor ctre funcii
i de returnare a valorilor rezultate.
Un program C++ este format din funcii. n afara funciilor nu pot exista n program dect
directive de preprocesor, de exemplu, pentru includere de fiiere header sau declaraii i definiii
de variabile globale.
ntr-un program C++ nstruciunile sunt grupate n blocuri de instruciuni cuprinse ntre
acolade ({}). Mai mult, blocurile de instruciuni pot fi doar blocuri de definire a corpului unei
funcii sau parte component a altor blocuri de instruciuni (blocuri imbricate).
Funciile reprezint un tip derivat din tipurile fundamentale. Exemple de declaraii de
funcii:
void f1();
//funcia cu numele f1 nu are de returnat nici o valoare void este un tip fundamental
//care specific o mulime vid de valori i nu are nici un parametru
// se poate scrie i void f1(void);
float functie(int a);
//funcia returneaz o valoare de tip float i primete la apel
//un argument formal (parametru) de tip ntreg double g(int, float);
//declaraiile de funcii se mai numesc i prototipuri
// n prototipuri, numele argumentelor formale sunt opionale
Definiia unei funcii include dup tipul returnat, numele funciei i lista de argumente
formale, blocul de definiie al funciei. Un exemplu de definiie a unei funcii:

Programare orientat obiect

int f (int x)
{
return x+1;
}
Funciile sunt apelate n cadrul altor funcii. La apelul unei funcii, argumentele de apel
iniializeaz argumentele formale din declaraia funciei, n ordinea din declaraie. Argumentele
unei funcii se pot transfera n dou moduri: apelul prin valoare i apelul prin referin. Apelul
prin referin va fi prezentat mai trziu. n apelul prin valoare, se copiaz valoarea argumentului
real n argumentul formal corespunztor al funciei iar modificrile efectuate asupra
argumentului funciei (asupra copiei) nu modific argumentul real. Un exemplu de apel al unei
funcii n cadrul altei funcii i transferul parametrilor:
#include <iostream.h>
int f(int);
// prototipul este un model limitat al unei entiti care urmeaz a fi definit mai
// trziu (dup apelul ei n funcia main)
// prototipul permite compilatorului s verifice numrul i tipurile argumentelor de apel
void g(int x){cout << Rezultatul este << x;}
//funcia g afieaz valoarea primit
void main()
{
int a=10;
a= f(a); // se apeleaz funcia f creia i se transmite valoarea 10
// iar funcia returneaz valoarea 11 care este memorat n variabila a
g(a); // se apeleaz funcia g creia i se transmite valoarea 11
}
int f (int x)
{
return x+1;
}
O funcie poate avea argumente implicite astfel nct ea poate fi apelat cu un numr de
argumente mai mic:
int produs (int a, int b, int c=1, int d=1)
{
return a*b*c*d;
}
void main()
{
cout<<produs(2,7,4,5)<<endl; //a=2 b=7 c=4 d=5
cout<<produs(2,7,4)<<endl; // a=2 b=7 c=4 d=1
cout<<produs(2,7); // a=2 b=7 c=1 d=1
}
Numai argumentele de la sfritul listei pot fi argumente implicite, sau altfel spus, odat
ce un parametru are o valoare implicit n lista parametrilor formali, toi cei ce urmeaz trebuie
s aib valori implicite. Nu este posibil s lsm guri n mijlocul unei liste, dect dac restul
valorilor vor fi implicite. Valorile implicite se dau n prototip sau n headerul din definiia
funciei i nu n ambele, caz n care compilatorul ar trebui s verifice dac ambele valori sunt
identice, lucru care ar complica i mai mult scrierea unui compilator pentru C++.
int produs (int a, int b, int c=1, int d); //eroare la compilare

Programare orientat obiect

n C++, mai multe funcii pot avea acelai nume, dac se pot diferenia prin numrul sau
tipul argumentelor de apel. Mecanismul se numete suprancrcarea funciilor (overloading):
int f(int);
long f(int, int);
void main()
{
f(2); //apeleaz f(int)
f(2,3); //apeleaz f(int, int)
}
Tipul returnat nu este folosit pentru a determina care funcie va fi apelat. De asemenea,
exemplul de mai sus face referire la acelai domeniu de definiie.

5.3. Domeniu de definiie, domeniu de vizibilitate


Domeniul de definiie al unui nume prin care se identific o entitate a unui program este
zona din program n care numele este cunoscut i poate fi folosit. Dat fiind c un nume este fcut
cunoscut printr-o declaraie, domeniile numelor se difereniaz n funcie de locul n care este
introdus declaraia n program. Un nume declarat ntr-un bloc este local blocului i poate fi
folosit numai n acel bloc, ncepnd din locul declaraiei i pn la sfritul blocului i n toate
blocurile incluse dup punctul de declaraie.
Argumentele formale ale unei funcii sunt tratate ca i cnd ar fi declarate n blocul cel
mai exterior al funciei respective. Un nume declarat n afara oricrui bloc are ca domeniu
fiierul n care a fost declarat i poate fi utilizat din punctul declaraiei pn la sfritul fiierului.
Numele cu domeniu fiier se numesc nume globale.
Un nume este vizibil n ntregul su domeniu de definiie dac nu este redefinit ntr-un
bloc inclus n domeniul respectiv. Dac ntr-un bloc interior domeniului unui nume se redefinete
(sau se redeclar) acelai nume, atunci numele iniial (din blocul exterior) este parial ascuns, i
anume n tot domeniul redeclarrii. Un nume cu domeniu fiier poate fi accesat ntr-un domeniu
n care este ascuns prin redefinire, dac se folosete operatorul de rezoluie pentru nume globale
(::). Redefinirea unui nume este admis numai n domenii diferite. Dac unul din domenii este
inclus n cellalt domeniu, atunci redefinirea provoac ascunderea numelui din domeniul exterior
n domeniul interior. Redefinirea n domenii identice produce eroare de compilare. Un exemplu:
# include <iostream.h>
int index=13; // variabil global
void main()
{
float index=3.1415;//variabil local
cout<<valoarea indexului local este << index << endl;
cout<<valoarea indexului global este << ::index << endl;
}
O entitate este creat atunci cnd se ntlnete definiia sa (care este unic) i este distrus
(n mod automat) cnd se prsete domeniul ei de definiie. O entitate cu nume global se
creeaz i se iniializeaz o singur dat i are durata de via pn la terminarea programului.
Entitile locale se creeaz de fiecare dat cnd execuia programului ajunge n punctul de
definire a acestora, cu excepia variabilelor locale declarate de tip static, care se iniializeaz o
singur dat la prima execuie a instruciunii. O variabil global sau static neiniializat
explicit, este iniializat automat cu 0. Un exemplu:

Programare orientat obiect

static unsigned i; // iniializat automat cu valoarea 0

5.4. Constante simbolice


O constant simbolic (sau constant cu nume) este un nume a crui valoare nu poate fi
modificat n cursul programului:
# include <iostream.h>
void afisare(const int data);//parametrul formal data este o constant pe parcursul
// ntregii funcii i orice ncercare de a asigna o nou
// valoare acestei variabile va produce eroare la compilare
void main()
{
const int START=3; //compilatorul nu va permite ca accidental sau intenionat
//s fie schimbat valoarea START pentru c a fost declarat
//constant
afisare(START);
}
void afisare(const int data)
{
cout<<data<<endl;
}
Orice nume de funcie este o constant simbolic.

5.5. Alte tipuri derivate


Tablourile (vectori, matrice) de entiti de unul din tipurile fundamentale, cu excepia
tipului void pot fi unidimensionale sau multidimensionale:
int x[]={1,2,3,4};
char str[]=abcde; //vector de caractere ->ir
int y[5][5];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)

//spre deosebire de C, n C++ variabilele se pot declara/defini


//ct mai aproape de locul n care sunt folosite
// dac n bucla for care execut de 5 ori operaia de iniializare
//se execut mai multe intruciuni, acestea formeaz
// un bloc de instruciuni ce trebuie delimitat prin acolade

//{
y[i][j]=i+j;
//}
Pointer-ul n C++ reprezint o adres ctre o variabil de un tip oarecare i se declar cu
operatorul * n faa numelui. Acesta realizeaz operaia de derefereniere, adic accesarea
obiectului a crei adres o reprezint pointer-ul. Un exemplu:
char c1=a; //variabila c1
char* p1=&c1; //p1 memoreaz adresa lui c1; operatorul & - obine adresa lui c1
char c2=*p1; //derefereniere, c2=a

Programare orientat obiect

Definiia C++ permite ca un pointer ctre o constant s fie definit astfel nct valoarea
ctre care indic pointerul s nu poat fi schimbat, dar pointerul n sine s poat fi mutat ctre o
alt variabil sau constant:
const char *nume1= Andrei; //valoarea nu poate fi schimbat
Se pot declara i pointeri constani, care nu pot fi schimbai, nu pot indica alt variabil:
char const *nume2= Andrei; //pointerul nu poate fi schimbat
Numele unui tablou poate fi folosit ca pointer la primul element al tabloului:
char sir[]=abc;
char* p=sir;
char* q= &sir[0];

//p=q; p+1 indic elementul urmtor al tabloului, sir[1],


//deci p+1 este cu sizeof(char) octei mai mare dect valoarea lui p

Pointerul la void (void*) permite programatorului s defineasc un pointer care s poat


fi folosit pentru a accesa variabile de diferite tipuri n cadrul unui program:
int* pt_int;
float* pt_float;
void* general;
general=pt_int;
general=pt_float;
Variabilele referin se declar folosind operatorul ampersand n faa numelui i se
deosebesc de toate celelalte variabile pentru c acioneaz ca un pointer autorefereniabil. Dup
iniializare, variabila referin devine un sinonim pentru variabila de iniializare, astfel nct
schimbnd valoarea variabilei se schimb i valoarea referinei, deoarece, de fapt, ele refer
aceeai valoare:
int i=1;
int& r=i;
i=i+1; // i++; i i r au valoarea 2
Variabile referin nu se folosesc uzual aa cum s-a artat mai sus ci, mai degrab, pentru
apelul prin referin a unei funcii, atunci cnd se acceseaz direct variabila din argumentul real
transmis funciei i nu o copie a ei. Apelul prin referin permite transmiterea unei variabile unei
funcii i a modificrilor efectuate de aceasta n funcia apelant:
#include <iostream.h>
void f(int in1, int& in2)
{
in1= in1+10;
in2= in2+10;
cout<<in1<<in2;
}
void main()
{
int a=7;
int b=8;
cout<<a<<b; // afieaz 7 8

10

Programare orientat obiect

f(a,b); // afieaz 17 18
cout<<a<<b; // afieaz 7 18
}

5.6. Alocare i eliberare dinamic de memorie


n limbajul C, se pot aloca dinamic zone n memoria liber (heap) folosind funcii de
bibliotec (malloc(), calloc(), realloc()) i se pot elibera folosind funcia free(). La aceste
posibiliti care se pstreaz n C++, se adaug operatorii de alocare i eliberare dinamic a
memoriei, new i delete. n timpul crerii C++, s-a simit nevoia ca, din moment ce alocrile i
aliberrile dinamice de memorie sunt o parte intens folosit n programe, ele s devin o parte a
limbajului n loc de o librrie adugat, astfel c operatorii new i delete sunt de fapt parte a
limbajului C++, la fel cum sunt cei de adunare sau de atribuire. Exemple de utilizare:
int* pi=new int(3);
// alocare int i iniializare
double* pd=new double; // alocare fr iniializare
delete pi;
delete pd;
O situaie care trebuie evitat:
int *p1, *p2;
*p2=7;
p1=new int;
p2=p1;
// p2 va referi acum variabila la care pointeaz i p1,
//n acest caz orice referin ctre variabila la care pointa anterior p2 este pierdut
//i nu mai poate fi eliberat (dealocat);
//ea este pierdut n heap pn la ntoarcerea n sistemul de operare
delete p1; // p1 este dealocat, iar p2 nu mai poate fi eliberat
Folosirea operatorilor new i delete pentru alocarea dinamic i dezalocarea unui vector
unidimensional este urmtoarea:
char* pv=new char[20];
delete []pv;
// este corect i delete pv; pentru c char este un tip predefinit
// dar nu i pentru tipuri definite de utilizator

5.7. Tipuri definite de utilizatori


Ca i n C, n C++ se pot folosi tipul enumerare, uniunile i structurile. Un exemplu:
struct complex{
int real;
int imaginar;
};
void main()
{
complex nr1;
//nu mai este necesar folosirea cuvntului struct la definirea variabilei ca n C
nr1.real=1;
// iniializarea variabilei tip structur prin iniializarea fiecrui membru n parte
nr1.imaginar=1;
}

11

Programare orientat obiect

5.8. Operatori i instruciuni


Se folosesc n C++ operatorii din C:
- +,-,*,/ , % - operatori matematici;
- ++/-- - incrementare/decrementare;
- ! negaie, && SI logic, || SAU logic, etc.,
i deasemenea, instruciunile din C:
- if-else
- do-while
- for
- switch-break-continue, etc.

6. Exerciii propuse
1. Scriei un program care s afieze dimensiunea tipurilor fundamentale de date cu
ajutorul operatorului sizeof.
2. Creai un tablou bidimensional de dimensiune 5 x 5 de numere de tip ntreg, n care
numerele din prima coloan sunt multipli consecutivi ai lui 10, iar elementele consecutive din
linii sunt cresctoare cu o unitate. Afiai elementele tabloului.
3. Selectai elementele (2,3), (4,4), (4,0) din tabloul definit la exerciiul precedent cu
ajutorul pointerilor i afiai coninutul acestora prin derefereniere. Afiai coninutul ntregului
tablou de mai sus folosind pointeri, operaii asupra acestora i dereferenierea.
4. Creai o functie numit uppercase() care s transforme literele mici din irul cu care a
fost apelat n litere mari. Demonstrai funcionarea sa ntr-un program.(Indicatie: utilizai
funcia toupper() pentru a converti literele mici n litere mari).
5. Scriei o functie numit medie() care s calculeze media unui ir de valori de tip float.
Funcia va avea dou argumente.Primul este un pointer catre un tablou coninnd numerele, al
doilea este o valoare ntreag ce reprezint dimensiunea tabloului. Demonstrai folosirea ei ntrun program.
6. Scriei 3 versiuni ale funciei suma() cu urmtoarele prototipuri:
int suma(int , int)
float suma(float , float)
double suma(double , double)
Demonstrai folosirea lor ntr-un program.
7. S se scrie o funcie n care se detecteaz eroarea de alocare a memoriei cu operatorul
de alocare new.
8. S se rescrie urmtoarea instruciune for printr-o instruciune echivalent while:
for (i = 0; i < max_length; i++)
if (line[i] == ?) count++;
S se dea o nou implementare folosind un pointer.
9. S se rescrie funciile strlen(), care returneaz lungimea unui ir, strcpy(), care compar
dou iruri i strcpy() care copiaz un ir n alt ir. S se considere ce fel de tipuri de
argumente sunt necesare, dup aceea s se compare cu versiunea standard declarat n
<string.h>.
10. S se scrie o funcie strcat() care concateneaz dou siruri. Se va folosi operatorul
new pentru alocarea spaiului necesar rezultatului.
11. S se scrie o funcie strrev() care inverseaz poziia caracterelor ntr-un ir dat.
12. S se scrie o funcie atoi() care returneaz valoare de tip ntreg a unui ir de cifre
zecimale. S se scrie o funcie itoa() care genereaz irul de caractere care reprezint un numr
ntreg dat.

12

Programare orientat obiect

13. S se scrie declaraiile pentru urmtoarele tipuri de variabile: pointer la un caracter,


un vector de 10 valori ntregi, pointer la un vector de 10 valori ntregi, un pointer la un pointer la
un caracter.

13