Tipul struct — date diferite, ținute împreună

Bază~14 min4 pași

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;
Observația-cheie

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 nota

Exemplu 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.

Greșeli frecvente

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ști e.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

  • struct creează 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.

Întrebarea 1 / 3

Ce e o structură (`struct`) în C++?