Exemple de cod și explicații

1. Definirea unei clase și crearea unui obiect

În acest exemplu, vom crea o clasă Masina, vom adăuga atribute și metode, apoi vom crea și utiliza un obiect.

#include <iostream>
using namespace std;

// Definirea clasei
class Masina {
public:
string marca;
string model;
int an;

// Metodă pentru afișarea detaliilor despre mașină
void afiseazaDetalii() {
cout << "Marca: " << marca << ", Model: " << model << ", An: " << an << endl;
}
};

int main() {
Masina masina1; // Crearea unui obiect de tip Masina

// Inițializarea atributelor obiectului
masina1.marca = "Dacia";
masina1.model = "Logan";
masina1.an = 2022;

// Apelarea metodei
masina1.afiseazaDetalii();

return 0;
}

Explicație

  1. Definim clasa Masina, cu trei atribute (marca, model, an).
  2. Adăugăm o metodă afiseazaDetalii() pentru a afișa informațiile despre obiect.
  3. Creăm un obiect masina1 de tip Masina și îi inițializăm valorile.
  4. Apelăm metoda afiseazaDetalii() pentru a afișa detaliile.

Rezultatul afișat:

Marca: Dacia, Model: Logan, An: 2022

2. Utilizarea unui constructor

Un constructor este o funcție specială care este apelată automat la crearea unui obiect.

#include <iostream>
using namespace std;

class Masina {
public:
string marca;
string model;
int an;

// Constructor care inițializează obiectul
Masina(string m, string mo, int a) {
marca = m;
model = mo;
an = a;
}

void afiseazaDetalii() {
cout << "Marca: " << marca << ", Model: " << model << ", An: " << an << endl;
}
};

int main() {
// Creăm obiecte și le inițializăm direct prin constructor
Masina masina1("Toyota", "Corolla", 2023);
Masina masina2("Ford", "Focus", 2021);

masina1.afiseazaDetalii();
masina2.afiseazaDetalii();

return 0;
}

Explicație

  1. Adăugăm un constructor care primește trei parametri și inițializează atributele.
  2. Creăm obiecte masina1 și masina2, folosind constructorul.
  3. Apelăm metoda afiseazaDetalii() pentru fiecare obiect.

Rezultatul afișat:

Marca: Toyota, Model: Corolla, An: 2023
Marca: Ford, Model: Focus, An: 2021

3. Membri private și utilizarea getter și setter

Când variabilele sunt private, ele nu pot fi accesate direct din exteriorul clasei. Folosim metode getter și setter pentru a interacționa cu ele.

#include <iostream>
using namespace std;

class Masina {
private:
string marca;

public:
// Setter pentru a seta marca
void setMarca(string m) {
marca = m;
}

// Getter pentru a returna marca
string getMarca() {
return marca;
}
};

int main() {
Masina masina1;

masina1.setMarca("Mercedes");
cout << "Marca masinii: " << masina1.getMarca() << endl;

return 0;
}

Explicație

  1. Declarăm atributul marca ca private, astfel încât să nu poată fi accesat direct.
  2. Folosim setMarca() pentru a seta valoarea atributului.
  3. Folosim getMarca() pentru a obține și afișa valoarea atributului.

Rezultatul afișat:

Marca masinii: Mercedes

4. Moștenirea (Clase derivate)

O clasă poate moșteni atributele și metodele altei clase. În acest exemplu, MasinaSport moștenește Masina.

#include <iostream>
using namespace std;

// Clasa de bază
class Masina {
public:
string marca;
string model;
int an;

void afiseazaDetalii() {
cout << "Marca: " << marca << ", Model: " << model << ", An: " << an << endl;
}
};

// Clasa derivată care moștenește `Masina`
class MasinaSport : public Masina {
public:
int vitezaMaxima;

void afiseazaViteza() {
cout << "Viteza maxima: " << vitezaMaxima << " km/h" << endl;
}
};

int main() {
MasinaSport ferrari;

ferrari.marca = "Ferrari";
ferrari.model = "F8";
ferrari.an = 2022;
ferrari.vitezaMaxima = 340;

ferrari.afiseazaDetalii();
ferrari.afiseazaViteza();

return 0;
}

Explicație

  1. Clasa Masina conține atribute și metoda afiseazaDetalii().
  2. Clasa MasinaSport moștenește Masina și adaugă un nou atribut vitezaMaxima și o metodă afiseazaViteza().
  3. Obiectul ferrari are acces la metodele clasei de bază și cele noi din clasa derivată.

Rezultatul afișat:

Marca: Ferrari, Model: F8, An: 2022
Viteza maxima: 340 km/h

5. Destructor (ștergerea automată a obiectelor)

Un destructor este apelat automat la distrugerea unui obiect și este folosit pentru eliberarea resurselor.

#include <iostream>
using namespace std;

class Masina {
public:
string marca;

// Constructor
Masina(string m) {
marca = m;
cout << "Masina " << marca << " a fost creata." << endl;
}

// Destructor
~Masina() {
cout << "Masina " << marca << " a fost distrusa." << endl;
}
};

int main() {
Masina masina1("BMW");
return 0;
}

Explicație

  1. Constructorul este apelat automat când obiectul masina1 este creat.
  2. Destructorul este apelat automat când programul se termină și obiectul masina1 este distrus.

Rezultatul afișat:

Masina BMW a fost creata.
Masina BMW a fost distrusa.

Concluzie

  • Obiectele sunt instanțe ale claselor și pot fi create manual sau prin constructori.
  • Accesul la date poate fi controlat prin specificatori (private, public) și metode getter/setter.
  • Moștenirea permite reutilizarea codului între clase.
  • Destructorii sunt folosiți pentru curățarea automată a resurselor.

Aceste concepte sunt esențiale în programarea orientată pe obiecte în C++!