Documente Academic
Documente Profesional
Documente Cultură
- POO -
1
Organizare:
Curs – 3h/sapt. ; Laborator – 2h/sapt.
Cerinta de laborator din saptamana i+1 este aferenta cursului din saptamana i.
Solutia la cerinta propusa e notata la finalul laboratorului.
Obs! Parcurgeti cursul inainte de laborator, deoarece nu se face recapitularea acestuia.
Nota finala:
Laborator – 40 pcte - media notelor obtinute la fiecare cerinta de laborator
• O absenta = nota 0 (se poate reface un singur laborator la care ati fost absenti, in ultima
saptamana de scoala)
• Sunt premise maxim 2 absente (altfel laboratorul nu va fi promovat => refacere materie)
Verificari pe parcurs – 20 pcte – 2 x 10 pcte - 2 grile - 15-20 intrebari - sapt. 9 (29.11), 14
Pentru a intra in examenul final, sunt necesare minim 30 pcte din cele 60 pcte aferente
activitatilor de semestru (si max. 2 absente laborator).
3
De ce POO?
Unde?
Raspandire larga, necesar in multe domenii (aplicatii web, mobile, desktop; aplicatii
industriale, medicale, uz curent; jocuri; sisteme de operare; simulatoare, aplicatii pentru
4
sisteme embedded…)-> Angajare
POO?
➢ Paradigma de programare - model de limbaj de programare - organizat in jurul
obiectelor, datelor mai repede decat in jurul procedurilor.
*un program in viziunea voastra de pana acum …
procedura logica ce primeste date de intrare, le proceseaza si produce date de iesire.
2. Conceptele de POO sunt cel mai bine exprimate in C++ (dpdv educativ)
Daca se cunoaste C++ atunci se poate trece usor la Java/C#, programare vizuala,
6
programare dispozitive mobile…etc -> ! Angajare
Cuprins: • Limbaje interpretate si limbaje compilate; Cuvinte rezervate; variabile;
• STL
8
C1: Deosebiri intre C si C++
1. Introducere
d.p.d.v. al fisierelor
• c cplusplus
Atentie la standard:
98 -> 11/14/17/20
9
C1: Deosebiri intre C si C++
2. Operatii de intrare/iesire (citire/scriere) de la/pe consola in C++ :
• functiile printf, scanf cout, cin; <<, >> (obiecte si operatori de insertie si extractie)
• trebuie inclusa biblioteca: iostream si folosit namespace-ul std (detalii slideuri 50-52)
cin >> variabila; // de la obiectul consola (cin) se citeste (>>) valoarea variabilei
cout << variabila; // pe obiectul consola (cout) se afiseaza (<<) valoarea variabilei
• variabila poate sa fie de orice tip de date de baza sau sir de caractere
#include <iostream>
Exemple: using namespace std;
//main cout << “textul: ”<<sir;
int x, a; cout << “\n”;
double b;
char sir[20]; cout << “x=” << x<<endl;
in C :
oriunde in program
in C++ :
11
la inceputul programului oriunde in
in C : sau functei in C++ : program
// vizibilitate 1 // vizibilitate 2
C: C++:
struct point{ struct point {
int x; int x;
int y; int y;
}; };
Declarati o variabila de tip point. Cum fac initializarea ei? Cum ar arata functiile care14fac
operatiile de modificare si, respectiv, afisare ?
#include <iostream>
using namespace std;
struct point{
int x, y;
};
void modificare(point *p, int xx, int yy){ //se primeste adresa variabilei de modificat
// p->x=xx; // o copie a adresei e stocata in pointerul p
// p->y=yy; //sau
(*p).x=xx; // se lucreaza direct la adresa variabilei date ca parametru
(*p).y=yy; //si modificarile se pastreaza
}
int main() {
point x={1, 2}; //sau p.x=1; p.y=2;
modificare(&x, 2, 2); //transmitere prin referinta a variabilei = i se transmite adresa
afisare (x); //transmite prin valoare a variabilei = i se face o copie bit cu bit
return 0; 15
} //cum arata stiva programului?
C1: Deosebiri intre C si C++
5. Functii ca parti ale unor structuri (functii membre)
#include <iostream> int main()
using namespace std; {
point p={1,2};
struct point {//abstractizare – date+fct p.afisare(); // cout<<p.x<<“ “<<p.y<<endl;
int x; // x, y implicit publice p.modificare(3,3); // p.x=3;p.y=3;
int y; //<=>accesibile de oriunde p.afisare();
//din program
void modificare(int xx, int yy) // in momentul apelului, aceste functii primesc
{ // adresa variabilei (p) si au acces la campurile
x=xx;//x si y ale oricarei variabile // acesteia
y=yy;//de tip point care apeleaza
} //aceasta functie //similar cu ce se intampla in exemplul
//precedent, numai ca variabila cu care se
void afisare() //lucreaza nu e data ca parametru, ci stie sa
{ //foloseasca o functie asociata tipului ei
cout<<x<<" "<<y<<endl;
} return 0;
}; }
• denumite si functii membre sau metode; implicit publice
• functiile membre nu cresc dimensiunea tipului de date
• acces direct la campurile structurii (chiar daca sunt declarate 16 private)
• utilitatea acestor functii se va vedea in cazul programarii obiectuale.
Modificatori de acces – private, public
#include <iostream> int main()
using namespace std; {
// point p={-1,2}; //nu mai functioneaza
struct point {//incapsularea datelor //atribuirea directa de valori pentru x si y
private: int x; //tot ce urmeaza dupa //deoarece nu sunt accesibile din aceasta zona
int y; //private nu e vizibil //de cod
//decat intre {}
public: //se schimba vizibilitatea point p;
// functiile vor fi vizibile de oriunde p.modificare(1,2);
void modificare(int xx, int yy) p.afisare();
{ //if (xx>0&&yy>0)…
x=xx; // cout<<p.x<<“ “<<p.y<<endl;//nu mai am
y=yy; //acces la x si y
}
p.modificare(3,3);
void afisare() // p.x=3;
{ // p.y=3; ; //nu mai am acces la x si y
cout<<x<<" "<<y<<endl;
} p.afisare();
};//pana aici sunt campurile x si y accesibile
return 0;
De ce/cand as folosi private? }
17
Ce se intampla daca functiile nu erau declarate public?
C1: Deosebiri intre C si C++
6. Operatorul de rezolutie “::”
Permite accesul la un indicator (ex: o variabila sau metoda) cu un anumit domeniu fisier,
dintr-un bloc in care acesta nu e vizibil.
#include <iostream>
using namespace std;
int x; // x global
void f(int val)
{
int x = 0; // x local
::x = val; // ::x – referire la variabila globala x acoperita ca
cout<<x; 0 // vizibilitate (shadowed) de cea locala cu acelasi nume
x = ::x;
cout<<x; 4 // aici :: se refera la zona de cod (domeniul) fara
} // nume, imediat in afara functiei f
int main()
{
cout<<x; 0
f(4); De fapt acest operator a fost
cout<<x; 4 introdus pentru alt scop!
return 0;
} 18
//ce se afiseaza?
#include <iostream>
using namespace std; void point::afisare() //functia afisare din
// domeniul fisier cu numele point
struct point { {
private: int x;//altfel ar fi publice cout<<x<<" "<<y<<endl;
int y; }
In Code::Blocks
File -> New -> Project
Console Application
C++
Project Title
Salvare intr-un folder la alegere (unde se va genera un folder cu numele proiectului)
Finish -> proiectul e adaugat la workspace-ul curent, a fost generat main.cpp (acesta
este punctul de intrare in program si contine metoda main).
20
Codul scris trebuie sa fie lizibil -> putem sa il formatam
automat: Nume Proiect -> click dreapta-> ->Format this project
Run
21
C1: Deosebiri intre C si C++
7. Functii inline
Inline are efect doar asupra codului generat de compilator.
La fiecare apel - nu se apeleaza propriu-zis functia – ci se substituie apelul cu
codul ei = > executie mai rapida.
int f(int k = 0) {
return k*k;
}
// main
cout<<f()<<“ ”<< f(5); // va afisa 0 (folosind valoarea implicita) si 25
23
De evitat situatii sensibile de tipul impartirii la 0.
Parametrii impliciti trebuie sa se gaseasca la finalul listei de
parametri!
void f(int val = 0, int x) Eroarea generata de compilator la apelul f(2, 2):
{
default argument missing for parameter 2 of `void
cout<<val<<“ “<<x; f(int, int)'
Dar?
void f(int val=0, int x=0)
{ ✓
cout<<val<<“ “<<x; La apelul: f(2) se afiseaza: 2 0
! DAR Nu o sa am cum sa apelez implicit parametrul val
}
//se poate apela: f(2, 2); si explicit parametrul x
//sau f(2); 24
//sau f();
C1: Deosebiri intre C si C++
9. Supradefinirea functiilor (overload)
In C++ pot exista mai multe functii cu acelasi nume, dar semnatura diferita
in acelasi program (functii supradefinite).
Semnatura functiei = numarul, ordinea si tipul parametrilor
int arie_drept(int lun, int lat) float arie_drept(float lun, float lat)
{ {
return lun*lat; return lun*lat;
} }
25
float arie_drept(float lun) //arie patrat - caz special- un parametru
{
return lun*lun;
}
float arie_drept(int lun) {//daca ar fi vorba de un patrat
return lun*lun;
}
// main
cout<<arie_drept(2, 4);
cout<< arie_drept(2.5, 2.2);
cout<< arie_drept(2.5);
cout<< arie_drept(2);
In C++ se pot supradefini chiar si operatori: =,+, -, ++, --, <<, etc.).
26
Dati exemple de cazuri cand este util sa supradefinim functii!
C1: Deosebiri intre C si C++
10. Tipul referinta
Studiu de caz pentru construirea unei functii care interschimba valorile a 2 variabile:
int a,b; // variabile globale
a)
void shimba_1() // functie fara parametri
{
int temp=a;
a = b;
b = temp;
}
// main…
a = 3; b = 4;
cout<< a <<“ “<< b; //3 4
schimba_1();
cout<< a <<“ “<< b; //4 3
// main...
int a = 3, b = 4;
cout<< a <<“ “<< b;
schimba_2(a, b);
cout<< a <<“ “<< b; // ce rezultat – de ce?
28
c) cu pointeri:
void schimba_3(int *pa, int *pb)
{
int temp = *pa;
*pa = *pb;
*pb = temp;
}
//…main()
int a, b; // variabile locale
a = 3; b = 4;
cout<< a <<“ “<< b;
schimba_3(&a, &b); //transmit adresele lui a si b
cout<< a <<“ “<< b; // rezultat? – de ce?
// main…
int a=3,b=5;
schimba_4(a, b);
cout<<a<<“ “<<b; //5 3
30
Alt exemplu (functie care majoreaza cu o valoare o variabila):
// cu pointer // cu referinta
void majoreaza(int *var, int val) void majoreaza(int &var, int val)
{ {
*var += val; var += val;
} }
// main… // main
int x = 0; int x = 0;
majoreaza(&x, 5); majoreaza(x, 5);
// adresa lui x e trimisa ca argument // referinta la x e primita ca argument
Exemplu (incorect):
struct cmplx
{
float re, im;
};
cmplx & add(cmplx &c1, cmplx &c2) //de ce as vrea sa transmit parametrii prin referinta?
{
Se returneaza referinta
cmplx c3;
catre o variabila locala, dar
c3.re = c1.re + c2.re;
ea elibereaza stiva cand
c3.im = c1.im + c2.im;
functia se termina.
return c3;
}
/* utilizare*/ cmplx a,b; //init cu val 33
cmplx z = add(a, b);
•o referinta nu poate exista singura (int &ref) –se refera la ceva/cineva-> trebuie
initializata!
EX: int x=3;
int &ref=x;
cout<<ref; //3
• cand operatorul & este utilizat impreuna cu o variabila, expresia inseamna
“adresa variabilei indicate de referinta”;
• new – returneaza un pointer de tipul cerut (int*,point*, etc) catre o zona de memorie
bool sw;
if (3<4) sw=true; //sw=1;
else sw=false; //sw=0;
cout<<sw; //afiseaza 1
37
C1: Deosebiri intre C si C++
13. Cuvantul rezervat “const”
Primul sens – in contextul declararii de constante
Pointer constant - nu pot schimba adresa catre Pointer la o constanta – nu pot schimba
care pointeaza, dar pot modifica ce se gaseste la valoarea de la adresa catre care pointeaza, dar
acea adreasa: T * const ptr; pot modifica adresa catre care se pointeaza:
const T* ptr;
#include <iostream>
using namespace std; #include <iostream>
using namespace std;
int main(){
int a[] = {10,11}, b=3; int main(){
int* const ptr = a; int a = 10, b;
cout << *ptr << endl; //10 const int* ptr = &b;
cout << ptr << endl;//adresa
ptr = &a; //pot modifica adresa
*ptr = 11; //pot modif. ce se gaseste la adresa ptr
cout << *ptr << endl;//11 cout << *ptr << endl;//10
cout << ptr << endl;//adresa cout << ptr << endl;//adresa
Ce se intampla?
float sum(const float &xx, const float & yy)
{
xx+=yy; ERROR: assignment of read-only reference `xx'
return xx;
}
// main
Cuvantul cheie (rezervat) const apare uneori dupa lista de argumente a unor
metode (functii membre).
Exemplu:
struct dreptunghi
{ //main
private: dreptunghi d;
int lun; cout<<d.get_lun();
int lat; //d nu va fi modificat in
public: //urma apelului
int get_lun() const
{return lun;}
int get_lat() const
{return lat;} 41
};
Cineva defineste structura
#include <iostream> dupa anumite specificatii int dreptunghi::get_lat() const
using namespace std; Si altcineva face { if (lat<0) return 0;
implementarea functiilor else return lat;
struct dreptunghi{ }
private:
int lun;
int lat; int main()
public: {
void modif(int , int ); dreptunghi p[3];
int get_lun() const; p[0].modif(10,10);
int get_lat() const; cout<<p[0].get_lun();
};
return 0;
void dreptunghi::modif(int l1, int l2){ }
if ((l1 >= 0) && (l2 >= 0)) {
lun = l1;
lat = l2;
}
}
funct(3);
Se apeleaza: square(z);
DAR:
struct complex
{
private: double re;
double im;
public: void afis() const
{
cout<<re<<"+j*"<<im<<endl;
}
};
2. In main alocati dinamic spatiu pentru un vector de dim. 3 ce contine nr. complexe
T **mat=new T *[lin];
mat[i]=new T[col];
delete [] mat[i];
delete []mat;
cout<<mat[1][1];
//se afiseaza ce se gaseste la acea adresa
mat=NULL;
48
Problema 6
Ce se afiseaza?
int y(3); //int y=3;
int &x=y;
cout<<x<<" "; 3
cout<<&x<<" "; 0x28ff44
cout<<&y<<" "; 0x28ff44
x=5;
cout<<y<<" "; 5
int z=2;
x=z;
z++;
49
cout<<x<<y<<z; 223
using - cuvantul cheie - se poate folosi ca directiva pentru introducerea in zona de
lucru a unui intreg namespace (grupare de variabile/obiecte si functii):
#include <iostream>
using namespace std;
namespace first {
int x = 5;
int y = 10;
}
namespace second {
double x = 3.1;
double y = 2.7;
}
int main () {
using namespace first;
cout << x << endl;
cout << y << endl;
cout << second::x << endl; //folosind operatorul de rezolutie precizez ca ma refer la
cout << second::y << endl; //variabilele x si y din namespaceul second
return 0; 50
}
using si using namespace - sunt valide doar in blocul in care au fost
mentionate sau in intregul cod daca au fost folosite in maniera globala.
Examplu de utilizare a variabilelor dintr-un namespace si apoi a variabilelor din alt
namespace:
#include <iostream>
using namespace std;
namespace first {
int x = 5;
}
namespace second { //intr-un namespace pot sa fie implementate si functii
double x = 3.1416;
}
int main () {
{
using namespace first;
cout << x << endl; //5
}
{
using namespace second;
cout << x << endl; //3.1416
}
return 0; 51
}
Namespace alias
Putem declara nume alternative pentru namespaceuri existente astfel:
Namespace std
Toate fisierele din biblioteca standard C++ isi au declarate
variabilele/obiectele necesare in namespace-ul std.
De aceea includem biblioteca <iostream> si apoi precizam ca avem
nevoie de variabile/obiectele declarate in std (using namespace std), aici
fiind declarate obiectele cin, cout, endl.
Putem sa le utilizam si asa: std::cin std::cout std::endl, iar
namespaceul std nu mai trebuie inclus in intregime.
52