oop_curs2
TRANSCRIPT
-
7/21/2019 oop_curs2
1/41
Cursul de programare orientata
pe obiecte
Seria 14
Saptamana 2, 24 feb 2015Andrei Paun
-
7/21/2019 oop_curs2
2/41
-
7/21/2019 oop_curs2
3/41
Principiile programarii orientate pe
obiecte !biecte
Clase
"ostenire
Ascunderea informatiei
Polimorfism Sabloane
-
7/21/2019 oop_curs2
4/41
!biecte
au stare si actiuni #metode$functii%
au interfata #actiuni% si o parte ascunsa
#starea%
Sunt grupate in clase, obiecte cu aceleasi
proprietati
-
7/21/2019 oop_curs2
5/41
Clase
mentionea&a proprietatile generale ale
obiectelor din clasa respecti'a
clasele nu se pot (rula)
folositoare la encapsulare #ascunderea
informatiei%
reutili&are de cod: mostenire
-
7/21/2019 oop_curs2
6/41
"ostenire
multe obiecte au proprietati similare
reutili&are de cod
-
7/21/2019 oop_curs2
7/41
-
7/21/2019 oop_curs2
8/41
Polimorfism
tot pentru claritate$ cod mai sigur
Polimorfism la compilare: e*+ ma*#int%,
ma*#float%
Polimorfism la e*ecutie: -
-
7/21/2019 oop_curs2
9/41
Sabloane
din nou cod mai sigur$reutili&are de cod
putem implementa lista inlantuita de
.intregi
.caractere
.float
.obiecte
-
7/21/2019 oop_curs2
10/41
Pri'ire de ansamblu pentru C//
arne Stroustrup in 13 la ell
aboratories in "urra 6ill, 7e8 9erse
5 re'i&ii: 15, 10, 1 A7S-/-S!,
200; #corrigendum%, 2011 #C//11%, include ?iostream@
using namespace std
int main#%
B int i
cout ?? Dis is output+En $$ tDis is a single line comment
$F ou can still use C stle comments F$
$$ input a number using @@
cout ?? nter a number:
cin @@ i
$$ no8, output a number using ??
cout ?? i ?? sHuared is ?? iFi ?? En
return 0I
-
7/21/2019 oop_curs2
12/41
Jiferente cu C
?iostream@ #fara +D%
int main#% #fara 'oid%
using namespace std
cout, cin #fara K%
$$ comentarii pe o linie declarare 'ariabile
-
7/21/2019 oop_curs2
13/41
>include ?iostream@
using namespace std
int main# %B
float f
cDar strL0M
double d cout ?? nter t8o floating point numbers:
cin @@ f @@ d
cout ?? nter a string:
cin @@ str
cout ?? f ?? ?? d ?? ?? str return 0
I
-
7/21/2019 oop_curs2
14/41
citirea stringNurilor se face pana la primul
caracter alb
se poate face afisare folosind toate
caracterele speciale En, Et, etc+
-
7/21/2019 oop_curs2
15/41
=ariabile locale
$F -ncorrect in C+ !O in C//+ F$
int f#%
B
int i
i 10 int $F 8onQt compile as a C program F$
iF2
return
I
-
7/21/2019 oop_curs2
16/41
>include ?iostream@
using namespace std
int main#%
B
float f
double d
cout ?? nter t8o floating point numbers:
cin @@ f @@ d cout ?? nter a string:
cDar strL0M $$ str declared Dere, ust before 1st use
cin @@ str
cout ?? f ?? ?? d ?? ?? str
return 0
I
-
7/21/2019 oop_curs2
17/41
C// 'ecDi 's C// nou
fara con'ersie automata la int
nou tip de include
using namespace
func#int i%
B return iFi
I
int func#int i%
B return iFi
I
-
7/21/2019 oop_curs2
18/41
ipul de date bool
se definesc true si false #1 si 0%
C nu il defineste ca bool ci ca Rool #fara
true$false%
?stdbool+D@ pentru compatibilitate
-
7/21/2019 oop_curs2
19/41
2 'ersiuni de C// diferente:
7oile include ?iostream@ ?fstream@ ?'ector@ ?string@
math.h este
string.h este
math.h deprecated, folositi cmath
-
7/21/2019 oop_curs2
20/41
Clasele in C//
init#%, pusD#%, pop#% sunt functii membru
stc, tos: 'ariabile membru
>define S-T 100$$ Dis creates tDe class stac+
class stac B
int stcLS-TM
int tospublic:
'oid init#%
'oid pusD#int i%
int pop#%
I
-
7/21/2019 oop_curs2
21/41
se creea&a un tip nou de date
un obiect instantia&a clasa
functiile membru sunt date prin semnatura
pentru definirea fiecarei functii se foloseste ::
stac mstac
'oid stac::pusD#int i%
B if#tosS-T% B
cout ?? Stac is full+En
return
I
stcLtosM i
tos//I
-
7/21/2019 oop_curs2
22/41
:: scope resolution operator
si alte clase pot folosi numele pusD#% si pop#%
dupa instantiere, pentru apelul pusD#%
mstac+pusD#5% programul complet in continuare
stac mstac
-
7/21/2019 oop_curs2
23/41
-
7/21/2019 oop_curs2
24/41
ncapsulare
urmatorul cod nu poate fi folosit in main#%
stac1+tos 0 $$ rror, tos is pri'ate+
-
7/21/2019 oop_curs2
25/41
!'erloading de functii
polimorfism
simplicitate$corectitudine de cod
-
7/21/2019 oop_curs2
26/41
#include
using namespace std;
// abs is overloaded three ways
int absint i!;
double absdouble d!;long abslong l!;
int main!
"
cout
-
7/21/2019 oop_curs2
27/41
o'erload de functii
nume acelasi
diferenta e in tipurile de parametrii
tipul de intoarcere nu e suficient pentru
diferenta
se poate folosi si pentru functii complet
diferite #nerecomandat%
o'erload de operatori: mai tar&iu
-
7/21/2019 oop_curs2
28/41
"ostenirea
incorporarea componentelor unei clase in
alta
refolosire de cod
detalii mai subtile pentru tipuri si subtipuri
clasa de ba&a, clasa deri'ata
clasa deri'ata contine toate elementele
clasei de ba&a, mai adauga noi elemente
-
7/21/2019 oop_curs2
29/41
class building "
int rooms;
int floors;
int area;
public
void set-roomsint num!; int get-rooms!;
void set-floorsint num!;
int get-floors!;
void set-areaint num!;
int get-area!;
*;
// house is derived from building
class house public building "
int bedrooms;
int baths;
public void set-bedroomsint num!;
int get-bedrooms!;
void set-bathsint num!;
int get-baths!;
*;
tip acces: public, pri'ate, protected
mai multe mai tar&iu
public: membrii publici ai building
de'in publici pentru Douse
-
7/21/2019 oop_curs2
30/41
Douse 7U are acces la membrii pri'ati ai lui
building
asa se reali&ea&a encapsularea
clasa deri'ata are acces la membrii publici
ai clasei de ba&a si la toti membrii sai
#publici si pri'ati%
#include
-
7/21/2019 oop_curs2
31/41
#include iostream
using namespace std;
class building "
int rooms;
int floors;
int area;public
void set-roomsint num!;
int get-rooms!;
void set-floorsint num!;
int get-floors!;
void set-areaint num!;
int get-area!;
*;
// house is derived from building
class house public building "
int bedrooms;
int baths;public
void set-bedroomsint num!;
int get-bedrooms!;
void set-bathsint num!;
int get-baths!;
*;
// school is also derived from building
class school public building "
int classrooms;
int offices;
public
void set-classroomsint num!;
int get-classrooms!;
void set-officesint num!;
int get-offices!;
*;
void buildingset roomsint num!
-
7/21/2019 oop_curs2
32/41
g - !
" rooms num; *
void buildingset-floorsint num!
" floors num; *
void buildingset-areaint num!
" area num; *
int buildingget-rooms!" return rooms; *
int buildingget-floors!
" return floors; *
int buildingget-area!
" return area; *
void houseset-bedroomsint num!
" bedrooms num; *
void houseset-bathsint num!
"baths num; *
int houseget-bedrooms!
" return bedrooms; *
int houseget-baths!
" return baths; *void schoolset-classroomsint num!
" classrooms num; *
void schoolset-officesint num!
" offices num; *
int schoolget-classrooms!
" return classrooms; *
int schoolget-offices!" return offices; *
int main!
"
house h;
school s;
h.set-rooms$!; h.set-floors0!;
h.set-area12%%!;
h.set-bedrooms2!;
h.set-baths0!;
cout
-
7/21/2019 oop_curs2
33/41
-
7/21/2019 oop_curs2
34/41
Constructori$Jestructori
initiali&are automata
obiectele nu sunt statice
constructor: functie speciala, numele clasei
constructorii nu pot intoarce 'alori #nu au
tip de intoarcere%
-
7/21/2019 oop_curs2
35/41
-
7/21/2019 oop_curs2
36/41
-
7/21/2019 oop_curs2
37/41
// +sing a constructor and destructor. void stac6pushint i!"
-
7/21/2019 oop_curs2
38/41
#include
using namespace std;
#define 849: $%%
// 5his creates the class stac6.
class stac6 " int stc67849:;
int tos;
public
stac6!; // constructor
stac6!; // destructor
void pushint i!;
int pop!;
*;
// stac6s constructor
stac6stac6!
"
tos %; cout
-
7/21/2019 oop_curs2
39/41
Clasele in C//
cu (class)
obiectele instantia&a clase
similare cu structNuri si unionNuri au functii
specificatorii de acces: public, pri'ate, protected
default: pri'ate protected: pentru mostenire, 'orbim mai tar&iu
-
7/21/2019 oop_curs2
40/41
class nume_clasa {
private variabile si functii membru
specificator_de_acces:
variabile si functii membruspecificator_de_acces:
variabile si functii membru
$$ +++
specificator_de_acces:
variabile si functii membru
} lista_obiecte;
putem trece de la public la pri'ate si iar la public, etc+
-
7/21/2019 oop_curs2
41/41
se foloseste mai mult a doua 'arianta un membru #neNstatic% al clasei nu poate
a'ea initiali&are
nu putem a'ea ca membri obiecte de tipulclasei #putem a'ea pointeri la tipul clasei%
nu auto, e*tern, register
class employee "
char name73%; // private by default
public
void putnamechar Bn!; // these are public
void getnamechar Bn!;
private double wage; // now, private again
public
void putwagedouble w!; // bac6 to public
double getwage!;
*;
class employee "
char name73%;
double wage;
public
void putnamechar Bn!;
void getnamechar Bn!; void putwagedouble w!;
double getwage!;
*;