POO Cauta

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.

Obiective
  • 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
1Recapitulare: mediul de lucru, erori, memorie, debugger, parametri
2Recapitulare: pointeri, const, vectori, alocare dinamica
3Introducere in clase
4Constructori, destructor, metode de acces
5Membri constanti si statici, operatorul =, relatia “has a”
6Supraincarcare I: functii, operatori, friend
7Supraincarcare II: operatori uzuali
8Derivare / mostenire, exceptii
9Stream-uri si fisiere
10Supradefinire I: namespace, mostenire multipla, functii virtuale
11Supradefinire II: functii virtuale pure, clase abstracte, interfete
12Template-uri
13STL
14C++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

  1. File → New → Project → Console App (C++).
  2. Scrie codul in main.cpp.
  3. Build → Build Solution (Ctrl+Shift+B) compileaza si link-editeaza.
  4. 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
a: 3
p: ?
HEAP

int a = 3; int* p; - ambele sunt variabile locale, pe stiva.

Pasul 1/3

Debugger si fereastra Memory

Inainte sa apesi F10, spune cu voce tare ce valoare te astepti sa vezi. Apoi verifica.

Transmiterea parametrilor

ModSemnaturaFunctia poate modifica variabila apelantului?
Prin valoarevoid f(int x)Nu, lucreaza pe o copie
Prin referintavoid f(int& x)Da, x este un alt nume pentru variabila
Prin adresavoid 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)

Deschide in Godbolt

Verifica-te

1. Ai declarat int suma(int, int);, o apelezi in main, dar nu ai scris-o nicaieri. Ce fel de eroare primesti?

2. Unde se afla intregul creat cu int* p = new int(7); si cat traieste?

3. Ce este r dupa int a = 1; int& r = a;?

4. Care dintre urmatoarele sunt erori la executie (programul compileaza, dar se opreste)?

5. Ce afiseaza programul?
#include <iostream>
using namespace std;
void f(int x) { x++; }
void g(int& x) { x++; }
int main() {
    int a = 1;
    f(a); g(a); g(a);
    cout << a;
}

6. Ce afiseaza programul?
#include <iostream>
using namespace std;
void schimba(int* p) { *p = 10; p = nullptr; }
int main() {
    int a = 1;
    int* q = &a;
    schimba(q);
    cout << a << " " << (q != nullptr);
}

Scor: 0/6

Codul din repository: S01

Varianta in engleza