MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Variabile

Pentru stocarea datelor într-un program, în limbajul C++ se folosesc variabile. De fapt, o variabilă reprezintă o zonă de memorie denumită. O variabilă are un tip, un nume și o valoare. Tipul determină ce fel de date poate stoca variabila.

Înainte de utilizare, orice variabilă trebuie definită. Sintaxa definirii unei variabile este următoarea:

tipul_variabilei numele_variabilei;

Denumirea variabilelor

Numele unei variabile este o secvență de caractere alfanumerice și caractere de subliniere (_). În același timp, numele variabilei trebuie să înceapă cu o literă alfabetică sau cu caracterul de subliniere.

În plus, nu este permis să se folosească cuvinte cheie ale limbajului C++ ca nume de variabile, de exemplu for sau if. Totuși, astfel de cuvinte nu sunt foarte numeroase, iar pe măsură ce veți învăța C++, vă veți orienta ce cuvinte sunt considerate cheie.

Trebuie menționat că nu sunt recomandate următoarele tipuri de denumiri:

  • nume care încep cu două caractere de subliniere (__)
  • nume care încep cu un caracter de subliniere urmat de o literă mare
  • nume aflate în spațiul global (în afara funcției main) care încep cu un caracter de subliniere

Motivul este că astfel de denumiri cresc riscul de conflict cu nume (de exemplu, nume de variabile) generate de compilator sau definite în modulele standard incluse în C++. Din acest motiv, unii recomandă să nu se înceapă deloc un nume cu caracterul de subliniere.

Definirea unei variabile

În general, o variabilă este definită în următoarea formă:

tipul_variabilei numele_variabilei;

De exemplu, o definiție simplă a unei variabile:

int age;

Aici este definită variabila age, care are tipul int. Deoarece definirea unei variabile reprezintă o instrucțiune, se pune punct și virgulă la final.

De asemenea, trebuie avut în vedere că C++ este un limbaj case-sensitive, ceea ce înseamnă că registrul literelor (majuscule vs. minuscule) are o mare importanță. Cu alte cuvinte, în următorul cod vor fi definite două variabile diferite:

int age;
int age;

Prin urmare, variabila Age nu va reprezenta același lucru ca variabila age. De asemenea, nu este permis să declari mai multe variabile cu același nume, de exemplu:

int age;
int age;

O astfel de definire va genera o eroare în timpul compilării.

Inițializarea

După ce o variabilă este definită, i se poate atribui o valoare. Atribuirea unei valori inițiale unei variabile se numește inițializare.

În C++ există trei tipuri de inițializare:

  • Notația prin atribuire (assignment notation)
  • Notația funcțională (functional notation)
  • Inițializarea cu acolade (braced initialization)

Să analizăm fiecare dintre aceste tipuri de inițializare.

Notația prin atribuire

Esența notației prin atribuire constă în folosirea operatorului de atribuire (semnul „=” sau egal) pentru a transmite o anumită valoare unei variabile:

int age;
age = 20;

Aici, valoarea atribuită variabilei este numărul 20. Valorile constante de orice tip – cum ar fi numere, caractere, șiruri de caractere, precum 20, 123.456 (număr zecimal), 'A' sau "hello" – se numesc literali. Așadar, în acest exemplu, variabilei i se atribuie un literal întreg: 20.

De exemplu, să definim o variabilă într-un program și să afișăm valoarea ei în consolă:

#include <iostream>
 
int main()
{
    int age;
    age = 28;
    std::cout<<"Age = " << age;
}

Cu ajutorul secvenței de operatori << pot fi afișate mai multe valori în consolă.

După compilarea și rularea programului compilat, în consolă va fi afișat numărul 28.

Age = 28

Este posibil ca, încă din momentul definirii unei variabile, să i se atribuie o valoare inițială:

#include <iostream>
 
int main()
{
    int age = 28;
    std::cout<<"Age = " << age;
}

Inițializarea cu acolade

La inițializarea cu acolade (braced initialization), valoarea variabilei este specificată între acolade, imediat după numele acesteia:

int age {38};   // inițializare cu acolade

În acest caz, variabila va avea valoarea 38.

Notația funcțională

La notația funcțională, valoarea variabilei este specificată între paranteze rotunde, după numele acesteia:

int age(38);   // notație funcțională

În acest caz, variabila va avea valoarea 38.

În toate cele trei cazuri, valoarea atribuită variabilei poate fi o expresie mai complexă, calculabilă. De exemplu:

int age1 {22 + 5};
int age2 (22 + 5);
int age3 = 22 + 5;

Este posibilă și inițializarea mai multor variabile într-o singură instrucțiune:

int age1 {22}, age2 (23), age3 = 24;

În majoritatea cazurilor, toate cele trei variante de inițializare sunt echivalente. Totuși, inițializarea cu acolade este puțin mai sigură atunci când este vorba de o conversie de tip restrângătoare. În general, se așteaptă ca unei variabile să i se atribuie o valoare care corespunde tipului său. Dacă acest lucru nu se întâmplă, compilatorul va încerca să convertească valoarea atribuită în tipul variabilei. Conversia restrângătoare presupune transformarea unei valori dintr-un tip într-un alt tip care are un interval de valori mai mic. Astfel, o asemenea conversie poate duce la pierderi de informație. Să luăm următorul exemplu:

#include <iostream>

int main()
{
    int age1 (23.5);
    int age2 = 24.5;
    std::cout << "Age1 = " << age1 << "\n";
    std::cout << "Age2 = " << age2 << "\n";
}

Aici, variabilelor age1 și age2, care sunt de tip int (adică număr întreg), li se atribuie valori zecimale: 23.5 și 24.5.

Însă în majoritatea compilatoarelor — cel puțin la momentul redactării acestui text — acest cod se va compila și se va executa fără erori. Vom obține următorul rezultat la rulare:

Age1 = 23
Age2 = 24

Acum să luăm un exemplu de inițializare folosind acolade:

#include <iostream>
  
int main()
{
    int age {22.5};
    std::cout<<"Age = " << age << "\n";
}

Aici, variabilei age, care este tot de tip întreg (int), i se atribuie tot o valoare zecimală – 22.5. Totuși, de această dată, la compilare, mulți compilatori vor semnala o eroare. De exemplu, ieșirea compilatorului g++ ar putea arăta astfel:

hello.cpp: In function 'int main()':
hello.cpp:5:15: error: narrowing conversion of '2.25e+1' from 'double' to 'int' [-Wnarrowing]
    5 |     int age1 {22.5};

Trebuie menționat că unii compilatori pot, totuși, compila acest cod, însă vor afișa în continuare un avertisment.

Inițializarea cu zero

La inițializarea cu acolade, se poate omite valoarea:

int counter {};

În acest caz, variabila va fi inițializată cu valoarea zero și, de fapt, este echivalentă cu:

int counter {0};

Inițializarea implicită

Dacă o variabilă nu este inițializată în mod explicit, atunci are loc o inițializare implicită. Variabila primește o valoare prestabilită, care depinde de locul în care este definită.

Dacă o variabilă care aparține unui tip de bază (de exemplu, int) este definită în interiorul unei funcții, atunci ea va avea o valoare nedefinită. Dacă însă este definită în afara unei funcții (adică la nivel global), atunci ea va primi o valoare implicită corespunzătoare tipului său.

Pentru tipurile numerice, această valoare implicită este 0. De exemplu:

#include <iostream>
 
int x;
int main()
{
    int y;
    std::cout <<"X = " << x << "\n";
    std::cout <<"Y = " << y;
}

Variabila x este definită în afara unei funcții, așadar va primi valoarea implicită — adică numărul 0.

Situația este mult mai complicată în cazul variabilei y, care este definită în interiorul funcției main — valoarea acesteia va fi nedefinită, iar comportamentul va depinde în mare măsură de compilatorul folosit.

De exemplu, ieșirea unui program compilat cu G++ poate arăta astfel:

X = 0  
Y = 0

Însă în Visual Studio, lipsa unei valori inițiale pentru variabila y poate duce la o eroare de compilare.

În orice caz, este recomandat ca, înainte de utilizare, variabilei să i se atribuie explicit o valoare, și să nu se mizeze pe valoarea implicită.

Modificarea valorii

O caracteristică esențială a variabilelor este aceea că putem modifica valorile acestora:

#include <iostream>
 
int main()
{
    int age = 22;
    std::cout << "Age1 = " << age << "\n";
    age = 23;
    std::cout << "Age2 = " << age << "\n";
    age = 38;
    std::cout << "Age3 = " << age << "\n";
}

Ieșirea în consolă a programului:

Age1 = 22
Age2 = 23
Age3 = 38