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,sizesaudistance. Numele se ciocnesc cu funcțiile dinstdși primești erori ciudate. - Crezi că un alias creează un tip nou.
using Lei = double;șiusing 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.