Video: Linux Tutorial for Beginners: Introduction to Linux Operating System 2024
Programarea se referă la lizibilitate. Este dificil (de fapt este imposibil) să scrieți și să mențineți un program pe care nu îl puteți citi. O parte din citirea unei liste de cod sursă este înțelegerea a ceea ce reprezintă cifrele utilizate în program. Ajutorul cel mai de bază pe care C ++ îl oferă este omniprezența #define, ca în exemplul de mai jos:
#define PI 3. 141592653589793
Această soluție este în regulă pentru valori individuale, deși suferă de faptul că mecanismul #define nu este (strict vorbind) o parte din C / C ++, deoarece preprocesorul rulează înainte de compilator. Ca răspuns la aceasta, C ++ 2011 a introdus o expresie constantă constantă construct:
constexpr lung dublu PI = 3. 141592653589793;
Cuvântul contextual aduce constante în cortul C ++. Acest PI are un tip real, ca și alte variabile C ++. C ++ poate genera mesaje de eroare cu PI care fac mult mai mult sens decât cele care implică 3. 14159.
Expresiile constante sunt bine pentru valori constante individuale, dar adesea constantele reprezintă seturi de lucruri mai degrabă decât constante naturale, ca în exemplul următor:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … și așa mai departe …
Probabil că aceste constante sunt folosite pentru a identifica stările, probabil folosite ca un index într-o serie de obiecte de stare sau ca valoare într-o bază de date undeva.
C ++ a avut mult timp un mecanism îmbunătățit pentru definirea acestor tipuri de constante - enumerarea:
enum STATE {DC_OR_TERRITORY, // primește 0 ALABAMA, // primește 1 ALASKA, // primește 2 ARKANSAS, // … și curând…};
Cuvântul cheie enum introduce o secvență de constante numită "enumerare". În acest caz, enumerarea poartă numele STATE. Fiecărui element al acestei enumerări i se atribuie o valoare care începe la 0 și crește secvențial cu 1, deci DC_OR_TERRITORY este definită ca 0, ALABAMA este definită ca 1 și așa mai departe. Puteți suprascrie această secvențiere incrementală utilizând o instrucțiune de atribuire după cum urmează:
enum STATE {DC, TERITORIU = 0, ALABAMA, ALASKA, // … și așa mai departe …};
Această versiune a STATE definește un element DC, care are valoarea 0. Acesta definește apoi un element nou TERRITORY, care este de asemenea atribuit valoarea 0. ALABAMA preia cu 1, la fel ca înainte.
În practică, programatorul poate folosi enumerări pentru a scrie cod destul de ușor de citit, după cum urmează:
double taxRate (STATE s) {retur taxRatesByState [s];}
Singura problemă cu această abordare este că această enumerare nu creează un tip nou (așa cum ați putea crede).De fapt, conform standardului, STATE este doar un alt nume pentru int - și constantele ALABAMA, ALASKA și așa mai departe sunt toate de tip const int.
Compilatorul gcc oferă de fapt un enum declarat în acest fel o autoritate mai mică decât simpla numire a unei alte forme de int. De fapt, puteți suprascrie funcțiile bazate pe un tip enum:
void fn (STATE s); void fn (int n); fn (ALASKA); // invokes fn (STATE)
Standardul 2011 permite programatorului să creeze un tip complet nou utilizând cuvântul cheie enum. Deoarece creatorii noului standard nu au dorit să rupă codul existent, standardul necesită adăugarea unui cuvânt cheie suplimentar pentru a defini un tip de enumerare, ca în exemplul următor:
clasa enum STATE {DC, TERITORIUL = 0, ALABAMA, ALASKA, // … și așa mai departe …};
O clasă de enumerare este acum la fel de tip ca orice altă clasă definită de utilizator. Următoarele nu mai sunt legale din două motive:
int s = ALASKA;
În primul rând, ALASKA constantă este definită numai în spațiul de nume STATE. Astfel, numele constantei este STATE:: ALASKA. În al doilea rând, tipul nu este int, ci STATE. Nu puteți atribui o valoare de tip STATE unui int.
STATUL s = STAT:: ALASKA;
Programatorul poate reforma un STATE într-un int, dar trebuie să facă acest lucru în mod explicit -implicit conversii nu-l taie cu clase de enumerare:
int n = (int) STAT:: ALASKA;
Acest nou tip de enum poate fi de asemenea bazat pe unul din celelalte numere de numărare, pe lângă int:
clasa enum STAT: char {DC, // … restul declarației este același