Saptamana 01 / 14 Programare Orientata Obiect
Recapitulare - mediul de lucru si memoria
Cum este organizat cursul, cum lucram in Visual Studio, ce tipuri de erori intalnim, unde traiesc variabilele in memorie si cum transmitem parametrii.
- Sa cunosti structura cursului si modul de evaluare
- Sa creezi, compilezi si rulezi un proiect C++ in Visual Studio
- Sa deosebesti erorile de compilare, link-editare, executie si logice
- Sa explici diferenta dintre stiva (stack), heap si memoria statica
- Sa folosesti debugger-ul si fereastra Memory
- Sa alegi intre transmiterea prin valoare, referinta si adresa
Structura cursului si evaluare
Cursul are 14 saptamani. Fiecare saptamana are un curs si un seminar. La seminar scriem cod, il stricam si il reparam.
| Sapt. | Curs |
|---|---|
| 1 | Recapitulare: mediul de lucru, erori, memorie, debugger, parametri |
| 2 | Recapitulare: pointeri, const, vectori, alocare dinamica |
| 3 | Introducere in clase |
| 4 | Constructori, destructor, metode de acces |
| 5 | Membri constanti si statici, operatorul =, relatia “has a” |
| 6 | Supraincarcare I: functii, operatori, friend |
| 7 | Supraincarcare II: operatori uzuali |
| 8 | Derivare / mostenire, exceptii |
| 9 | Stream-uri si fisiere |
| 10 | Supradefinire I: namespace, mostenire multipla, functii virtuale |
| 11 | Supradefinire II: functii virtuale pure, clase abstracte, interfete |
| 12 | Template-uri |
| 13 | STL |
| 14 | C++11 si recapitulare finala |
La seminar sunt doua teste practice, in saptamanile 7 si 11. Sunt individuale, pe calculator si fara AI.
Mediul de dezvoltare Visual Studio
- File → New → Project → Console App (C++).
- Scrie codul in
main.cpp. - Build → Build Solution (Ctrl+Shift+B) compileaza si link-editeaza.
- Debug → Start Without Debugging (Ctrl+F5) ruleaza programul.
Erorile apar in fereastra Error List. Mesajele complete ale compilatorului sunt in fereastra Output. Citeste intotdeauna prima eroare. Multe dintre cele care urmeaza sunt doar consecinte ale ei.
Tipuri de erori
Eroare de compilare. Codul nu respecta regulile limbajului:
int x = 10
std::cout << x; // lipseste ';' pe linia anterioara
Eroare de link-editare. Functia este declarata, dar nu este definita nicaieri:
int suma(int a, int b); // doar declaratie
int main() { return suma(1, 2); } // LNK2019: unresolved external symbol
Eroare la executie. Programul compileaza, dar se opreste in timpul rularii:
int* p = nullptr;
*p = 5; // acces la adresa invalida
Eroare logica. Programul ruleaza si afiseaza ceva, dar rezultatul nu e cel dorit. Sunt cele mai greu de gasit.
Vrem suma elementelor vectorului. Ce afiseaza programul?
#include <iostream>
using namespace std;
int main() {
int v[3] = {1, 2, 3};
int s = 0;
for (int i = 1; i <= 2; i++) s += v[i];
cout << s;
} Tipuri de memorie
- Stiva (stack): aici stau variabilele locale si parametrii. Sunt create la intrarea in functie si distruse automat la iesire.
- Heap: memorie ceruta explicit cu
newsi eliberata explicit cudelete. Traieste pana o eliberezi tu. - Memoria statica: variabile globale si
static. Traiesc pe toata durata programului.
int a = 3; int* p; - ambele sunt variabile locale, pe stiva.
Pasul 1/3
Debugger si fereastra Memory
- Breakpoint (F9): programul se opreste pe linia respectiva.
- Step Over (F10): executa linia curenta fara sa intre in functii.
- Step Into (F11): intra in functia apelata.
- Watch / Locals / Autos: valorile variabilelor in momentul opririi.
- Debug → Windows → Memory → Memory 1: scrie o adresa (de ex.
&asaup) si vezi octetii de acolo.
Inainte sa apesi F10, spune cu voce tare ce valoare te astepti sa vezi. Apoi verifica.
Transmiterea parametrilor
| Mod | Semnatura | Functia poate modifica variabila apelantului? |
|---|---|---|
| Prin valoare | void f(int x) | Nu, lucreaza pe o copie |
| Prin referinta | void f(int& x) | Da, x este un alt nume pentru variabila |
| Prin adresa | void f(int* x) | Da, prin *x |
#include <iostream>
using namespace std;
void dublare(int x) { x = x * 2; }
int main() {
int a = 5;
dublare(a);
cout << a;
} Ruleaza si modifica programul de mai jos. Ce se schimba daca functia sumaValoare primeste int& s?
#include <iostream>
using namespace std;
void sumaValoare(int a, int b, int s) { s = a + b; }
void sumaReferinta(int a, int b, int& s) { s = a + b; }
void sumaAdresa(int* a, int* b, int* s) { *s = *a + *b; }
int main() {
int x = 3, y = 4, s = 0;
sumaValoare(x, y, s);
cout << "valoare: " << s << endl;
sumaReferinta(x, y, s);
cout << "referinta: " << s << endl;
s = 0;
sumaAdresa(&x, &y, &s);
cout << "adresa: " << s << endl;
}Intrare (stdin)
Verifica-te
Scor: 0/6