Sunteți pe pagina 1din 26

Programare Orientata pe Obiecte - POO

C1: Deosebiri intre C si C++

Bibliografie:

Florin Munteanu, Gheorghe Musca, Florin Moraru, C tehnici de

Programare, Ed. Joint Printing House, Bucuresti 1995

Mihaela Oprea Programare Orientata pe Obiecte, Ed. MatrixRom,

Bucuresti, 2003

Cuprins:
Supradefinirea functiilor Operatii de intrare/iesire Tipul referinta Functii in structuri

Introducere Comentarii Pozitia declaratiilor in bloc Operatorul de rezolutie :: Functii inline Argumente de functii cu valori implicite

C1: Deosebiri intre C si C++


d.p.d.v. al fisierelor

0. Introducere

*.c

=>

*.cpp
d.p.d.v. al compilatorului

#define _cplusplus
Exista medii de dezvoltare (Borland C) care au un compilator unic pentru programele scrise in C si C++ (care trebuie informate)!
2

C1: Deosebiri intre C si C++

1. Comentarii
/* citire data */ getdate(&data); sunet(); printf("\n Azi suntem in: %d.%d.%d\n\n",data.zi,data.luna,data.an); /* deschidere fisier fhandler=fopen("C:\\DATE\\REMEMBER.DAT","a"); fclose(fhandler);*/

in C :

in C++ :

int stare_Panel = 0; // butoane (8): Scenariu, Salvare, Configurare, Declansare, Analiza, // Adnotari, Ajutor, Iesire // stari (4): Initiala, Declansare, Analiza, Simulare int StariButoane[4][8] = {{0,1,1,0,0,0,0,0},{1,1,0,1,0,0,0,0},{0,1,0,1,1,0,0,0},{1,1,1,1,1,1,1,1}}; // int StariButoane[2][3] = {{1,2,3},{4,5,6}}; // = {{0,1,1,0,0,0,0,0},{1,1,0,1,0,0,0,0},{1,1,0,1,0,0,0,0}}; int g_NotepadExeHandle;
3

Daca linia este prea lunga si se trece automat pe linia urmatoare si comentariu nu mai are efect!

C1: Deosebiri intre C si C++


la inceput

2. Pozitia declaratiilor in program

in C :
oriunde in program

in C++ :

C1: Deosebiri intre C si C++


la inceput

in C :

main() { char c,x; int notifyCount = 42; /* Wait for at least 50 bytes in queue */ int eventChar = 13; /* Wait for LF */ int eventMask = LWRS_RXFLAG; int comPort = 5; handle = LoadPanel (0, "Reg_Test_62_RS232.uir", BI); DisplayPanel (handle);

SetCtrlAttribute(handle,BI_indic_com_man,ATTR_DIMMED,1); // Deschidere port serial OpenComConfig (5, "COM5", 9600, 0, 8, 1, 512, 512); SetComTime (5, 0.50); // initializare comcallback InstallComCallback (comPort, eventMask, notifyCount, eventChar, MessageReceived, NULL); SetIdleEventRate (50); InstallMainCallback (GetData,(void *)&x , 1); RunUserInterface();

C1: Deosebiri intre C si C++


oriunde in program

in C++ :

float sum(float v[], int n) { float s; for (int i=0; i<n; i++) s+=v[i]; return s; }

Atentie la vizibililatea variabilei respective:

// vizibilitate if(m>23.2) { double dv; // } else { //.. dv += 3.2; //.. }

// erore!!!!
6

C1: Deosebiri intre C si C++

3. Operatorul de rezolutie :: :
// global // local // global // corect dar nerecomandat

int x; void funct(void) { int x = 0; ::x = 5; x = ::x; }

De fapt acest operator a fost introdus pentru alt scop!

C1: Deosebiri intre C si C++

4. functii inline:
Au efect doar asupra codului generat de compilator.

in C++ :

inline int max(int a, int b) { return a>b ? a:b; } // utilizare: int z = max(x, y);

in C am intalnit ceva similar:


8

# define max(A, B) ((A) > (B) ? (A):(B)

C1: Deosebiri intre C si C++

5. argumente de functii cu valori implicite:


In C++ pot exista functii cu mai putine argumente decat in cele din declaratie

int f(int k = 0) { return k*k; } // utilizare: printf(%d %d\n, f(), f(5));

// prototip pt. f

// va afisa 0 5

C1: Deosebiri intre C si C++

void printvect(int v[], int n, char*text = ) { printf(%s\n, text); for(int i = 0; i < n; i++) printf(%d ,v[i]); printf(\n); } // utilizare: printvect(x, nx, vectorul x); printvect(y, ny);

Este bine sa avem grija de variabilele sensibile de evitat situatii sensibile de genul impartirii la 0.

10

C1: Deosebiri intre C si C++

6. Supradefinirea functiilor:
In C++ pot exista functii (diferite) cu acelasi nume dar numar si tip al parametrilor diferit.

Exemplu (arie a unui dreptunghi):

int arie_drept(int lun, int lat) { return lun*lat; }

float arie_drept(float lun, float lat) { return lun*lat; }

double arie_drept(double lun, double lat) { return lun*lat; }

11

C1: Deosebiri intre C si C++

float arie_drept(float lun) { return lun*lun; }

// utilizare: printf(%d %f %f %f, arie_drept(2, 4), arie_drept(2.5, 2.2), arie_drept(2.5), arie_drept(2.5, 4.7));

In C++ se pot supradefini chiar si operatorii din C (+, -, ++, --, /, etc.).

12

C1: Deosebiri intre C si C++

7. operatii de intrare/iesire (citire/scriere) de la consola in C++ :


de ce consola? istoric cin, cout printf, scanf trebuie inclusa biblioteca: #include <iostream.h> cin << ..; // cin este obiectul // << - este operatorul
cin >> x; cin >> a >> b; char*text = text exemplu; cout << text; cout << << \n; cout << x; cout << x << y; cout << x << << y; cout << x= << x; cout << x= << x << y= << y;

Exemple:

13

C1: Deosebiri intre C si C++

8. Tipul referinta:

Studiu de caz pentru construirea unei functii care interschimba doua variabile:
// functie fara parametri

a)

shimba_1() { int temp; temp = a; a = b; b = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_1(); printf(a=%d b=%d\n, a, b);

// variabile globale

14

C1: Deosebiri intre C si C++

functia schimba doar variabilele globale a si b are o viteza mica spatiu de memorie este discutabil (variabila temp dispare dar apare stiva - desen) sunt necesare alte variante

15

C1: Deosebiri intre C si C++

b1)

schimba_2(int ca, int cb) { int temp = ca; ca = cb; cb = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_2(a, b); printf(a=%d b=%d\n, a, b); // variabile globale // acelasi rezultat de ce?

// este o varianta gresita !!!

16

C1: Deosebiri intre C si C++

b2)

int ra = 0; int rb = 0; schimba_2(int ca, int cb) { int temp = ca; ca = cb; cb = temp; ra = ca; rb = cb; } // utilizare; main() { int a ,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_2(a, b); a = ra; b = rb; printf(a=%d b=%d\n, a, b); // variabile globale // rezultat de ce?

codul este functional dar este dificil si urat spatiu de memorie suplimentar timp suplimentar
17

C1: Deosebiri intre C si C++

c) cu pointeri:

REMEMBER: // np pointer catre o variabila de tipul tip // pi pointer catre o variabila de tip int // & - operatorul de referentiere (adresare) *pi = 3; // * - operatorul de dereferentiere (indirectare) // * si & - operatori inverse

tip *np; int i = 0; int *pi; pi = &i; // i = 3;

T1 x; T2 *py; x = *(&x); py = &(*py);

18

C1: Deosebiri intre C si C++

schimba_3(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_3(&a, &b); printf(a=%d b=%d\n, a, b); // variabile globale // rezultat? de ce?

codul este functional este varianta clasica necesita atentie sporita deoarece erori de editare genereaza erori logice greu de detectat.

19

C1: Deosebiri intre C si C++

d) cu referinta:
&x referinta catre o variabila x (un nou tip de date)

schimba_4(int &ra, int &rb) { int temp = ra; ra = rb; rb = temp; } // utilizare; if (a > b) schimba_4(a, b);

Alt exemplu:

int int_val = 3; int &ref = int_val; int_val++; // ref++; - compilatorul face indirectarea
20

C1: Deosebiri intre C si C++

Alt exemplu (functie care majoreaza cu o valoare o variabila):

// adresa lui x trimisa ca argument

// o referinta a lui x este trimisa ca argument 21

// cu pointer void majoreaza(int *val) { *val += 5; } // utilizare main() { int x = 0; //. Majoreaza(&x); // } // cu referinta void majoreaza(int &val) { val += 5; } // utilizare main() { int x = 0; //. majoreaza(x); // }

C1: Deosebiri intre C si C++

tipul referinta este folosit ca parametru formal in interiorul functiilor; este posibila declararea unor parametri tip referinta si in exteriorul finctiilor dar nu exista motiv pentru aceasta; o functie nu poate returna un pointer la o variabila locala (de ce?) tot asa nu poate returna o referinta la o variabila locala;

Exemplu (incorect):

struct cmplx { float re, im; } cmplx & addx(cmplx &c1, cmplx &c2) { cmplx c3; c3.re = c1.re + c2.re; c3.im = c1.im + c2.im; return c3; } // utilizare cmplx z = addx(a, b);

Se poate corecta daca se elimina operatorul & => o functie ce returneaza ca parametru o structura!!!

22

C1: Deosebiri intre C si C++

o referinta nu poate exista singura (int &ref) nu este permisa (se refera la ce sau cine?); spre deosebire un pointer (int *pint) poate exista separate si mai mult poate fi refolosit; o referinta poate fi vazuta ca un alias al unei variabile din acest motiv, nu poate fi folosita pentru o alta variabila; cand operatorul & este utilizat impreuna cu o referinta (a unei variabile, expresia inseamna adresa variabilei indicate de referinta; in mod contrar, un pointer este o variabila de sine statatoare, adresa acestuia fiind diferita de adresa unei variabile catre care acesta indica.

23

C1: Deosebiri intre C si C++

9. Functii ca parti ale unor structuri:


struct persoana { char nume[80], adresa[80]; void print (void); } // definire functie print: void persoana::print() { printf( Nume: %s\n, Adesa: %s\n, nume, adresa); } // utilizare: persoana p; strcpy(p.nume, Ion); strcpy(p.adresa, Spl. Indep. 313); p.print();

denumite si functii membru sau metode; Utilitatea acestor functii se va vedea in cazul programarii obiectuale.
24

C1: Deosebiri intre C si C++

10. Cuvantul rezervat const:

Cuvantul este un modificator de tip declara o constanta de un anumit tip specificat (int, float, double etc.); Modificarea ulterioara a valorii acestor este interzisa.

int main() { int const ival = 3; ival =4;

// o constanta de tip int // initializata cu valoarea 3 // atribuire ce duce // la un mesaj de eroare

return (0); }

25

C1: Deosebiri intre C si C++

11. Observatii utile:

26

S-ar putea să vă placă și