typedef:
typedef tip_existent noul_nume ;
tip_existent este orice tip, fundamental sau derivat, and noul_nume este un identificator nou pentru tipul dat. |
|
C, WORD, pChar și field pentru char, unsigned int, char* și respectiv char[50]. O dată definite, ele pot fi folosite în orice declarație ca orice tip de dată valid: |
|
|
|
|
|
typedef și cele definite cu using sunt semantic echivalente. Singura diferență o reprezintă faptul că typedef are anumite limite, când vine vorba de șabloane, limite pe care using nu le are. De aceea, using este mai generic, deși typedef are o istorie mai lungă și este probabil mult mai întâlnit în codul actual.typedef nici using nu creează un tip de dată nou. Ele doar creeează sinonime pentru tipurile existente. Aceasta înseamnă că tipul myword de mai sus, declarat cu tipul WORD, poate fi la fel de bine considerat ca unsigned int; chiar nu contează, căci ambele se referă la același tip.int pentru a ne referi la un anumit tip de parametru în loc de folosirea directă a lui int ar permite înlocuirea ușoară cu long (sau alte tipuri de date) într-o versiune ulterioară, fără a fi necesară schimbarea fiecărei instanțe care a folosit tipul respectiv.
union nume_tip {
tip_membru1 id_membru1;
tip_membru2 id_membru2;
tip_memebru3 id_membru3;
.
.
} nume_obiecte;
|
nume_tip, în care toate datele membru ocupă același spațiu fizic de memorie. Dimensiunea acestui tip este egală cu dimensiunea celui mai larg membru. De exemplu: |
|
niste_tipuri) cu trei membri: |
|
|
|
int ocupă 4 bytes, iar tipul short ocupă 2 bytes, uniunea definită mai suspermite accesarea aceluiași grup de 4 bytes: mix.l, mix.s și mix.c, pe care îl putem folosi cum dorim pentru a accesa acești bytes: ca și cum ar fi o singură valoare de tip int sau ca și cum ar fi două valori de tip short sau ca un tablou de elemente de tip char. Exemplul amestecă tipuri, tablouri și structuri într-o uniune pentru a evidenția diverse metro de accesare a informațiilor. Pentru un sistem de tip little-endian, această uniune s-ar putea reprezenta astfel:
| structură cu uniune obișnuită | structură cu uniune anonimă |
|---|---|
|
|
pret), în timp ce pentru a doua uniunea nu are un nume. Aceasta afectează modalitatea de accesare a membrilor dolari și yen ai unui obiect de acest tip. Pentru un obiect de primul tip (cu o uniune obișnuită), se procedează astfel: |
|
|
|
dolari și yen partajează aceeași locație de memorie, deci nu se pot reține simultan două valori diferite. Valoarea lui pret se exprimă în dolari sau yen, dar nu simultan în ambele.
enum nume_tip {
valoare1,
valoare2,
valoare3,
.
.
} denumiri_obiecte;
|
nume_tip, care poate avea pe oricare dintre valoare1, valoare2, valoare3, ... ca valoare. Obiectele (variabilele) de acest tip pot fi instanțiate direct prin denumiri_obiecte.culori_t pentru a memora culori, folosind următoarea sintaxă: |
|
culori_t sunt doar cele cuprinse între acoladele definiției. De exemplu, după definirea tipului enumerare culori_t, devin valide următoarele expresii: |
|
enum se convertesc implicit la numere întregi de tip int și invers. De fapt, elementelor unei enum li se atribuie întotdeauna o valoare numerică întreagă cu care vor fi echivalente și pentru care devin un alias. Dacă nu se precizează explicit, valoarea întreagă atribuită primului element al enumerării este 0, valoarea pentru al doilea este 1, pentru al treilea 2, și așa mai departe... De aceea, pentru tipul de dată culois_t definit mai sus, negru este echivalent cu 0, albastru cu 1, verde cu 2, și așa mai departe... |
|
y2k de tip enumerare luni_t poate lua oricare dintre cele 12 valori posibile, de la ianuarie până la decembrie și care sunt echivalente cu valorile de la 1 la 12 (nu de la 0 la 11, pentru că lui ianuarie i s-a atribuit valoarea 1).enum sunt convertibile implicit la int, iar fiecare dintre valorile enumeratorilor este de fapt de tip int, nu se poate face distincție între 1 și ianuarie - ele reprezintă exact aceeași valoare, de același tip. Motivația este de ordin istoric și se moștenește de la limbajul C.enum real, care nici nu este convertibil implicit la int și nici nu are valorile enumeratorilor de tip int, ci de exact tipul definit în el însuși, păstrându-se siguranța informației. Asemenea definiții se implementează cu enum class (sau enum struct) în loc de enum: |
|
enum class trebuie inclusă în tipul de dată (acest lucru era posibil și cu tipurile enum, dar era opțional). De exemplu: |
|
enum class au un control mai mare asupra tipurilor de date incluse; pot fi orice tipuri de date întregi, precum char, short sau unsigned int, ceea ce este esențial pentru determinarea dimensiunii tipului. Se preciează prin includerea simbolului două puncte si a tipului de dată, urmat de tipul enumerare. De exemplu: |
|
CuloareOchi este un tip diferit, având dimensiunea egală cu a lui char (1 byte).Structuri de date | Index | Clase (I) |