De ce contează?
O fișă de bibliotecă ține laolaltă titlul, autorul și anul unei cărți — pe aceeași foaie, nu pe trei foi separate care s-ar putea amesteca. Structura (struct) e fișa: o singură „cutie" cu mai multe rubrici care descriu același lucru.
Problema vectorilor paraleli
Vrei să ții, pentru fiecare elev, numele și nota. Fără structuri, ai folosi doi vectori „paraleli":
string nume[100];
int nota[100];Elevul i e nume[i] + nota[i]. Merge — dar e fragil: dacă sortezi nota și uiți să rearanjezi nume, datele se desincronizează și totul devine greșit.
Ce este o structură
O structură definește un tip nou care grupează mai multe câmpuri, posibil de tipuri diferite, sub un singur nume:
struct Elev {
string nume;
int nota;
};Acum Elev e un tip, ca int sau string. O variabilă de acest tip ține numele și nota împreună:
Elev e;
e.nume = "Ana";
e.nota = 9;Accesezi câmpurile cu operatorul punct: e.nume, e.nota. Fiecare câmp se comportă exact ca o variabilă obișnuită de tipul lui.
Inițializare
Poți seta câmpurile pe rând sau dintr-o dată, în ordinea declarării:
Elev a;
a.nume = "Bogdan";
a.nota = 8;
Elev b = {"Carmen", 10}; // in ordinea campurilor: nume, apoi notaExemplu complet
#include <iostream>
using namespace std;
struct Elev {
string nume;
int nota;
};
int main() {
Elev e = {"Ana", 9};
cout << e.nume << " are nota " << e.nota << "\n"; // Ana are nota 9
e.nota = 10; // modific un camp
cout << e.nume << " are acum " << e.nota << "\n"; // Ana are acum 10
return 0;
}Structuri ca parametri de funcție
O structură se transmite ca orice variabilă. Pentru a evita copierea (mai ales dacă are câmpuri mari), o dai prin referință constantă:
void afiseaza(const Elev &e) { // const & = fara copie, fara modificare
cout << e.nume << ": " << e.nota << "\n";
}Dacă vrei ca funcția să modifice structura originală, folosești referință fără const.
Capcane la tipul struct:
- Uiți
;după acolada de închidere:struct Elev { ... };— punctul și virgula final e obligatoriu, altfel eroare de compilare. - Confuzi
.cu->: pentru o variabilă obișnuită foloseștie.nota;->e doar pentru pointeri. - Ordinea greșită la inițializarea cu acolade:
{"Ana", 9}pune valorile în ordinea câmpurilor declarate. Inversarea lor dă erori sau date greșite. - Copiezi structuri mari inutil: transmiterea prin valoare copiază toate câmpurile. Pentru structuri mari folosește
const &.
Recapitulare
structcreează un tip nou care grupează câmpuri (posibil de tipuri diferite) sub un nume.- Accesezi câmpurile cu operatorul punct (
e.nume); structura se comportă ca orice variabilă. - Față de vectori paraleli, structura ține datele aceluiași element împreună și elimină riscul de desincronizare.