using în C++

Bazele programului C++98 (alias de tip: C++11)

Aduce nume dintr-un spațiu de nume în locul curent sau creează un nume nou (alias) pentru un tip existent.

Sintaxă
using namespace std;          // aduce toate numele
using std::println;           // aduce un singur nume
using NumeNou = TipExistent;  // alias de tip (C++11)
using enum Culoare;           // C++20

Ce face using

using are trei folosiri principale. using namespace std; face ca toate numele din std să poată fi scrise fără prefix. using std::println; aduce un singur nume, ceea ce este mai sigur.

using Lei = double; creează un alias de tip: Lei devine un alt nume pentru double. Este forma modernă a lui typedef și funcționează și cu șabloane (template).

Din C++20, using enum Culoare; aduce valorile unui enum class în locul curent, util într-un switch. În clase, using Baza::functie; face vizibile funcțiile clasei de bază.

Exemple

Exemplul 1: Alias de tip

Aliasurile fac codul mai ușor de citit: Lei spune ce reprezintă numărul, deși este tot un double.

#include <map>
#include <print>
#include <string>

using Lei = double;
using Catalog = std::map<std::string, int>;

int main() {
    Lei salariu = 4500.50;
    Catalog note = {{"Ana", 10}, {"Mihai", 8}};
    std::println("Salariu: {} lei", salariu);
    std::println("Nota Anei: {}", note["Ana"]);
}

Rezultat

Salariu: 4500.5 lei
Nota Anei: 10

Exemplul 2: Aducerea unui singur nume și a unui spațiu de nume

În interiorul unei funcții, using namespace afectează doar acea funcție, deci este mult mai sigur decât la începutul fișierului.

#include <print>
#include <string>
#include <vector>

using std::println;

int main() {
    using namespace std;
    vector<string> orase = {"Iași", "Cluj", "Brașov"};
    println("Primul oraș: {}", orase.front());
}

Rezultat

Primul oraș: Iași

Exemplul 3: using enum (C++20) și alias de șablon

#include <array>
#include <print>

enum class Anotimp { primavara, vara, toamna, iarna };

template <typename T>
using Trei = std::array<T, 3>;

const char* nume(Anotimp a) {
    switch (a) {
        using enum Anotimp;
        case primavara: return "primăvara";
        case vara: return "vara";
        case toamna: return "toamna";
        case iarna: return "iarna";
    }
    return "?";
}

int main() {
    Trei<int> temperaturi = {18, 31, 12};
    std::println("{} - {} grade", nume(Anotimp::vara), temperaturi[1]);
}

Rezultat

vara - 31 grade

Greșeli frecvente

  • Scrii using namespace std; la începutul fiecărui fișier și apoi îți numești o variabilă count, size sau distance. Numele se ciocnesc cu funcțiile din std și primești erori ciudate.
  • Crezi că un alias creează un tip nou. using Lei = double; și using Euro = double; sunt același tip, deci compilatorul nu te oprește să aduni lei cu euro.

Comenzi înrudite

  • typedef: Creează un nume nou (alias) pentru un tip existent; forma veche, moștenită din C, a lui using.
  • namespace: Grupează funcții, clase și variabile sub un nume comun, ca să nu se încurce cu alte nume identice din program sau din biblioteci.
  • enum: Definește un tip cu o listă fixă de valori cu nume, de exemplu zilele săptămânii sau stările unei comenzi.
  • template: Scrie o funcție sau o clasă o singură dată, pentru orice tip; compilatorul generează varianta potrivită pentru fiecare tip folosit.