typedef în C++

Creează un nume nou (alias) pentru un tip existent; forma veche, moștenită din C, a lui using.

Sintaxă
typedef TipExistent NumeNou;
typedef int (*PointerFunctie)(int);

Ce face typedef

typedef dă un al doilea nume unui tip: după typedef unsigned long long Contor;, poți scrie Contor în loc de unsigned long long. Nu se creează un tip nou, doar un nume.

Ordinea este „tipul vechi, apoi numele nou”, ca la o declarație de variabilă. La pointerii la funcții sintaxa devine greu de citit, motiv pentru care în C++ modern se preferă using NumeNou = Tip;.

Vei întâlni des typedef în cod vechi și în bibliotecile C (de exemplu typedef struct { ... } Punct;).

Exemple

Exemplul 1: Alias pentru un tip lung

#include <print>

typedef unsigned long long Contor;

int main() {
    Contor vizitatori = 1'250'000;
    vizitatori += 1;
    std::println("Vizitatori: {}", vizitatori);
}

Rezultat

Vizitatori: 1250001

Exemplul 2: typedef față de using pentru un pointer la funcție

Ambele linii declară același tip: pointer la o funcție care primește un double și returnează un double. Varianta cu using se citește de la stânga la dreapta.

#include <print>

double cu_tva(double pret) { return pret * 1.21; }

typedef double (*Calcul)(double);
using CalculNou = double (*)(double);

int main() {
    Calcul f = cu_tva;
    CalculNou g = cu_tva;
    std::println("{:.2f} {:.2f}", f(50), g(50));
}

Rezultat

60.50 60.50

Greșeli frecvente

  • Inversezi ordinea: typedef Contor unsigned long;. Corect este tipul existent întâi, apoi numele nou.
  • Încerci să faci un alias de șablon cu typedef. Nu se poate; pentru template <typename T> using Lista = std::vector<T>; ai nevoie de using.

Comenzi înrudite

  • using: Aduce nume dintr-un spațiu de nume în locul curent sau creează un nume nou (alias) pentru un tip existent.
  • struct: Grupează mai multe valori într-un singur tip; ca o clasă, dar cu membri publici implicit.
  • pointeri (*, &): Un pointer este o variabilă care ține adresa altei variabile; prin el poți citi și modifica valoarea de la acea adresă.