Didaxis
lecție · Informatică

Definirea tipurilor de date

Tipuri definite de utilizator în C/C++: typedef, using și tipuri enumerare; folosirea lor în declarații.

Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 3 · rezumatul lecției

Pe scurt

În C/C++, programatorul poate defini nume de tipuri pentru a exprima mai clar rolul datelor. typedef creează un alias pentru un tip existent, iar în C++ using poate face același lucru. O enumerare definește un tip ale cărui valori poartă nume, potrivit pentru stări precum „oprit”, „pornit” sau „pauză”. Un alias nu creează un tip distinct; o enumerare creează un tip enumerat.

using NumarElevi = int;
enum class Stare { oprit, pornit, pauza };
NumarElevi n = 28;
Stare s = Stare::pornit;

Variabila n are tipul int sub un nume mai clar. Variabila s are tipul Stare și valoarea pornit. Folosirea acestor nume poate preveni confuzii între categorii de date, dar nu înlocuiește verificarea valorilor primite la intrare.

Desen la lecția „Definirea tipurilor de date”
2în detaliustratul 2 din 3 · pentru clasă și Bacalaureat

În detaliu

În C și C++, programatorul poate da nume noi tipurilor și poate defini tipuri ale căror valori sunt nume. Aliasul de tip se scrie în C și C++ cu typedef, iar în C++ și cu using: typedef unsigned long long ULL; și using ULL = unsigned long long; au același efect. Numele ULL și tipul de bază sunt interschimbabile la declararea variabilelor, deci un alias nu creează un tip distinct, ci doar un nume mai scurt sau mai clar. Enumerarea definește un tip cu un număr mic de valori numite. Fiecare nume (enumerator) primește o valoare întreagă: primul are implicit 0, iar următorii cresc cu 1; valoarea poate fi fixată explicit, iar numerotarea continuă de la ea. În C++ există și enum class (C++11), care limitează numele în domeniul enumerării și interzice conversia implicită la int; în C această construcție nu există.

Exemplul 1 — aliasuri. NumarElevi se folosește pentru un contor, iar ULL pentru valori mari fără semn.

#include <iostream>
using namespace std;
typedef unsigned long long ULL;
using NumarElevi = int;
int main() {
    ULL mare = 18446744073709551615ULL;
    NumarElevi n = 28;
    cout << mare << ' ' << n << ' ' << sizeof(ULL);
    return 0;
}

Programul afișează 18446744073709551615 28 8: cea mai mare valoare a tipului unsigned long long este , iar tipul ocupă 8 octeți. NumarElevi este tot un int; numele arată doar ce reprezintă variabila. Numele nu înlocuiește verificarea datelor: dacă se citește un număr negativ de elevi, tipul nu îl respinge.

Exemplul 2 — enumerare cu valori implicite și explicite. Pentru zilele unei săptămâni putem scrie enum Zi { luni = 1, marti, miercuri };. Enumeratorii primesc valorile 1, 2 și 3, deoarece după luni = 1 numerotarea continuă din unu în unu. O variabilă Zi d = miercuri; are valoarea 3, iar cout << d afișează 3, pentru că un enum obișnuit se convertește implicit la int. La enum class Stare { oprit, pornit, pauza }; numele se scriu Stare::pornit, iar afișarea cere conversie explicită: static_cast<int>(Stare::pornit) dă 1.

Exemplul 3 — valorile unei enumerări cu salturi. În enum E { a = 2, b, c = 8, d }; valorile sunt , , și . Enumeratorul b continuă de la a, iar d continuă de la c. Un enumerator poate primi și o valoare deja folosită, de pildă enum F { x = 1, y = 1 };, deci enumeratorii nu sunt neapărat distincți.

Exemplul 4 — enumeratorul-contor. Un ultim enumerator, fără altă semnificație decât numărătoarea, dă numărul de valori ale enumerării și poate fi dimensiunea unui tablou:

enum Zi { luni, marti, miercuri, nrZile };
int ore[nrZile] = {2, 0, 3};
int total = 0;
for (int z = luni; z < nrZile; ++z)
    total += ore[z];
cout << total;

Enumeratorii au valorile 0, 1, 2, iar nrZile este 3, deci tabloul are trei elemente, iar ciclul adună și afișează 5. Între limbaje există o diferență: în C instrucțiunea enum Zi z = 1; este permisă, pe când în C++ atribuirea unui întreg unei variabile de tip enumerat cere conversie explicită, static_cast<Zi>(1). Enumeratorii sunt constante: instrucțiunea luni = 5; nu compilează, ca la o variabilă declarată cu const. În schimb, ei se pot compara, iar z < nrZile ordonează după valorile întregi ale enumeratorilor.

Enumerările sunt potrivite pentru stări, categorii și zile, adică pentru mulțimi mici de valori, iar aliasurile pentru nume de tipuri lungi sau pentru a exprima rolul datelor. Într-un switch, enumeratorii pot fi etichetele case, ceea ce face codul mai ușor de citit decât numerele 0, 1, 2.

3pentru admiterestratul 3 din 3 · pentru examene

Pentru admitere

La citirea codului, separă numele tipului de valoarea variabilei. typedef int T; T x = 5; declară un întreg x cu valoarea 5, nu un tip numeric nou cu alte reguli. În enum E { a = 2, b, c = 8, d }; valorile sunt . Sintaxa permisă depinde de limbajul precizat în subiect: typedef și enum sunt disponibile în C și C++, în timp ce using Alias = Tip; și enum class sunt construcții C++. În C, după definirea enum E { ... }; o variabilă se declară enum E x;, pe când în C++ este suficient E x;. Pentru o probă formulată în C, răspunsul trebuie scris în C, chiar dacă un exemplu de liceu a fost prezentat în C++. La Bac, urmărește varianta C/C++ indicată de subiect și nu transforma aliasul într-un tip distinct.

Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?

enum E { a = 2, b, c = 8, d };
cout << a + b + c + d;
  • a) 6
  • b) 10
  • c) 22
  • d) 17

Răspunsul corect este c). Valorile enumeratorilor sunt , , și , deoarece b continuă de la a, iar d de la c. Suma lor este . Varianta a) ar rezulta dacă numerotarea ar începe de la 0 și ar ignora valorile explicite: . Varianta b) adună numai valorile scrise explicit, . Varianta d) ar rezulta dacă după c = 8 numerotarea ar relua de la valoarea lui b, adică d ar fi 4. Valorile enumeratorilor se determină parcurgând enumerarea de la stânga la dreapta și continuând de la ultima valoare.

Greșeli frecvente

  • Greșit: typedef int T; creează un tip nou, incompatibil cu int.
    Corect: T este doar un alt nume pentru int.
  • Greșit: într-o enumerare, valorile cresc mereu de la 0.
    Corect: un enumerator cu valoare explicită schimbă punctul de la care continuă numerotarea.
  • Greșit: enum class există și în limbajul C.
    Corect: este o construcție C++ (C++11); în C se folosește enum.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Surse și referințe

Redactare proprie, conform programei:

  • UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro

Documente consultate

  • cppreference, „Enumeration declaration” și „Type alias, alias template”, secțiunile de sintaxă; en.cppreference.com
  • UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121)
  • Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3 și 6; aplicabilitate din 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro

Desene: Redactare proprie (desen original)

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.