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).Previous: Structuri de date | Index | Next: Clase (I) |