Professional Documents
Culture Documents
Obiective:
Funcții cu parametrii impliciți
Funcții cu acelaşi nume
Tipul de date referinţă (&)
Alocatorul new/delete
Streamuri de intrare/ieșire (cin /cout)
Concepte OOP (introductiv)
1
Mihai TOGAN
Funcții cu parametrii impliciţi
#include <iostream>
void main()
{
Variante greşite:
float get_point_distance (int x, int y = 0, int z)
float get_point_distance (int x = 1, int y, int z)
float get_point_distance (int x = 1, int y = 0, int z)
Observaţii:
Parametrii unei funcţii pot avea valori implicite.
Parametrii cu valori implicite trebuie sa fie la finalul listei de parametrii.
Atenţie: uneori, mecanismul este ȋnsă nerecomandat (!!). Poate conduce ușor la erori
de scriere a programelor (cu erori de execuţie şi buguri greu de detectat).
Atenție de asemenea la cazurile de ambiguitate!
2
Mihai TOGAN
Funcții cu acelaşi nume (function overloading)
struct t_Complex
{
float re;
float im;
};
void main()
{
int i = add_int (1, 2); /* suma a 2 nr intregi */
float f = add_float ((float) 1, 2.0); /* suma a 2 nr reale */
3
Mihai TOGAN
struct t_Complex
{
float re;
float im;
};
void main()
{
printf ("%d\n", add (1, 2)); /* suma a 2 nr intregi */
printf ("%f\n", add ((float) 1, 2.0)); /* suma a 2 nr reale */
Compilatorul generează cod obiect pentru apelul funcției corecte folosind pentru asta
tipul parametrilor de apel.
Funcţii cu acelasi nume (function overloading) variantă de polimorfism.
Este necesar sa difere semnătura funcţiei (în cazul nostru lista de parametrii).
Atenţie la cazurile de ambiguitate!
Q: care este avantajul ?
4
Mihai TOGAN
Tipul de date referinţă (&)
Consideraţii iniţiale:
Referinţa este un alias pentru o variabilă.
Dacă variabila reprezintă o anumită zonă de memorie, și referinţa va reprezenta
aceeaşi zonă de memorie.
Întotdeauna, o referințǎ se declarǎ cǎtre ceva care existǎ deja declarat (alocat).
Nu se alocǎ memorie suplimentarǎ.
Referinţele se declară cu (&).
Exemplul 1:
#include <iostream>
void main()
{
int x = 5;
int& y = x;
printf ("%d\n", y); // 5
y++;
printf ("%d\n", x); // 6
Exemplul 2:
#include <iostream>
void schimba (int &x, int &y)
{
int z = x;
x = y;
y = z;
}
void main()
{
int a = 10, b = 20;
printf ("%d, %d\n", a, b); // 10, 20
schimba (a, b);
printf ("%d, %d\n", a, b); // 20, 10
}
5
Mihai TOGAN
Exemplul 3:
#include <iostream>
struct t_Point
{
int a;
int b;
};
return *pz;
}
void main()
{
t_Point x = {1, 2}, y = {3, 4};
t_Point z = suma (x, y); /* suma a 2 puncte */
6
Mihai TOGAN
Alocatorul de memorie din C++ (new/delete)
Varianta C++ pentru alocarea dinamică de memorie (echivalentul C++ pentru alloc/free).
Varianta C (malloc/free)
#include <stdio.h>
#include <stdlib.h>
void main ()
{
int *p1 = (int *) malloc (sizeof (int)); // alocare 1 intreg
*p1 = 12;
// ...
printf ("%d", *p1);
int n = 20;
int *p2 = (int *) malloc (n * sizeof (int) ); // alocare n=20 intregi
// ...
unsigned char *p3 = (unsigned char*) malloc (n); //alocare n = 20 bytes
// ...
free (p1); // eliberare memorie (1 intreg)
free (p2); // eliberare memorie (20 intregi)
free (p3); // eliberare memorie (20 octeti)
int n = 20;
int *p2 = new int[n]; // alocare n=20 intregi
// ...
unsigned char *p3 = new unsigned char[n]; // alocare n = 20 intregi
// ...
delete p1; // eliberare memorie (1 intreg)
delete[] p2; // eliberare memorie (20 intregi)
delete[] p3; // eliberare memorie (20 bytes)
}
int main ()
{
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
int main ()
{
int n = 10;
cout << "Value of n is : " << n << endl;
}
int main ()
{
int i;
cout << "Please enter an integer value: ";
cin >> i;
cout << "The value you entered is " << i;
cout << " and its double is " << i*2 << ".\n";
return 0;
}
#include <iostream>
using namespace std;
int main ()
{
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
A) Încapsularea
Pentru orice problemă identificăm entităţile implicate.
Entităţile interacţionează între ele, sau sunt grupate pentru a forma alte entităţi mai mari.
Fiecare entitate are nişte atribute/proprietăţi (o structură de date).
Fiecare entitate are un comportament (o funcţionalitate asigurată prin funcţii).
Ideea încapsulării: grupăm structura de date şi funcţionalităţile la un loc în cadrul unui
container (clasa).
Partea publică: o parte din componentele unei clase sunt interfeţe pentru interacţiunea cu
alte entităţi externe.
partea privată: celelalte componente sunt de uz strict intern, la nivelul clasei; nu vor
interacţiona în mod direct cu alte entităţi.
B) Moştenirea
Moştenirea reutilizarea codului.
Pe baza unor componenete (clase) deja implementate putem deriva apoi alte componente
care în primul rând păstrează structura de date şi comportamentul iniţial, şi la care putem
adăuga sau modifica.
C) Polimorfismul
Comportament polimorfic comportament „diferit” în situaţii diferite.