Struktura je heterogenní objektový datový typ. To znamená, že datový typ struktura je složen z různých datových typů. Navenek vystupuje struktura jako jeden objekt. Prvky struktury jsou implicitně veřejné (public).
struct [jmenovka] { Typ1 prvek1; Typ2 prvek2; ... } [proměnná1, proměnná2, ...];
jmenovka | |||
Nepovinná. Je-li uvedena jedná se o deklaraci struktury, jehož jméno bude jmenovka. Není-li jmenovka uvedena, musí být uvedena alespoň jedna proměnná tohoto typu. | |||
Typ1 prvek1 | |||
Složky struktury - proměnné, funkce a prototypy. | |||
proměnná | |||
Nepovinné, definice proměnných, ukazatelů na ně atd. tohoto typu (vytvářeného typu struktura). Lze je definovat i později. |
Struktura nemůže obsahovat ve svém těle proměnnou vlastního typu. Toto omezení lze obejít použitím ukazatele nebo reference na proměnnou typu struktura.
struct auto { char vyrobce[20]; char typ[20]; int rychlost; int cena; void tisk_informaci(int); };
Strukturové proměnné lze definovat buď přímo v deklaraci struktury nebo později pomocí identifikátoru (jména) struktury. V případě, že není uveden identifikátor struktury při její deklaraci, nelze později definovat proměnné typu této struktury.
struct auto { char vyrobce[20]; char typ[20]; int rychlost; int cena; void tisk_informaci(int); }; auto Felicie; // vytvoření proměnné typu struktura auto
Struktury je možné, podobně jako pole, inicializovat přímo při definici. Stačí vypsat seznam inicializačních hodnot do složených závorek. Hodnoty musí být odděleny čárkami. Obdobně jako u pole není nutné inicializovat všechny prvky struktury. Platí omezení, že prázdné prvky musí být umístěny v souvislém bloku na konci struktury.
Příklad inicializace struktury auto
auto Felicie = {"Škoda", "Felicie", 155, 240000}; // ukázka inicializace hodnot při definici
K prvkům struktury je možné přistupovat dvěma způsoby. Jejich použití je závislé na tom, zda máme k dispozici proměnnou strukturového typu nebo ukazatel na proměnnou strukturového typu. Přistupujeme-li k prvku struktury přes proměnnou strukturového typu použijeme konstrukci:
strukturová_proměnná . prvek_struktury
Přistupujeme-li k prvku struktury přes ukazatel na strukturovou proměnnou použimeme konstrukci:
ukazatel_na_strukturovou_proměnnou -> prvek_struktury
Příklad změny a získání hodnoty z prvků struktury
struct auto { char vyrobce[20]; char typ[20]; int rychlost; int cena; void tisk_informaci(int); }; void main() { auto Felicie; // definice proměnné typu struktura auto *Felicie; // definice proměnné typu ukazatel na strukturu pFelicie = &Felicie; // nastavení ukazatele na proměnnou Felicie Felicie.rychlost = 156; pFelicie->cena = 240000; strcpy(Felicie.typ,"Felicie"); strcpy(pFelicie->vyrobce,"Škoda"); printf("Vyrobce: %s, typ: %s, rychlost: %d, cena: %d\n", Felicie.vyrobce, Felicie.typ, Felicie.rychlost, Felicie.cena ); printf("Vyrobce: %s, typ: %s, rychlost: %d, cena: %d\n", pFelicie->vyrobce, pFelicie->typ, pFelicie->rychlost, pFelicie->cena ); }
Při programování se jistě dostanete do situace, kdy budete potřebovat vytvořit strukturu, která by měla odkazovat sama na sebe. Tento případ nastane například při tvorbě zřetězeného seznamu. Programovací jazyk, ale neumožňuje odkazovat v těle struktury na strukturu téhož typu (na sebe). Proto musíme použít místo struktury ukazatel nebo referenci na strukturu.
struct polozka { int hodnota; položka *p_dalsi; };
Datový typ union je do jisté míry obdobný jako typ struktura. Union obsahuje více položek, ale při deklaraci je vyhrazena paměť pouze na velikost největší položky z položek definovaných v Union. To znamená, že v jeden okamžik lze používat pouze jednu položku z unionu. Položky jsou v datovém typu union definované "přes sebe". Typ union se využívá zejména pro úsporu místa v případě, kdy je potřeba využít vždy pouze jeden prvek, ale programátor předem nemůže určit který.
union [jmenovka] { Typ1 prvek1; Typ2 prvek2; ... } [proměnná1, proměnná2, ...];
jmenovka | |||
Nepovinná. Je-li uvedena jedná se o deklaraci unionu, jehož jméno bude jmenovka. Není-li jmenovka uvedena, musí být uvedena alespoň jedna proměnná tohoto typu. | |||
Typ1 prvek1 | |||
Složky unionu - proměnné, funkce a prototypy. | |||
proměnná | |||
Nepovinné, definice proměnných, ukazatelů na ně atd. tohoto typu (vytvářeného typu union). Lze je definovat i později. |
unie auto { char jmeno_vyrobce_kratsi[10]; char jmeno_vyrobce_delsi[30]; };
Prvkem unie nemůže být proměnná jejího vlastního typu. Toto omezení lze obejít použitím ukazatele nebo reference na proměnnou typu union.
Prvky unie nemohou být virtuální funkce, třídy s vlastními definicemi konstruktoru, destruktoru nebo přiřazovacího operátoru.
Unie nemohou mít předky ani potomky.
V příkladu deklarujeme unii auto se dvěmi prvky rozlišenými podle délky pole pro zadání jména výrobce. Pokud bude jméno výrobce kratší než 10 znaků použije se menší pole, v opačném případě se použije pole delší:
unie auto { char jmeno_vyrobce_kratsi[10]; char jmeno_vyrobce_delsi[30]; }; void main () { char pomocna[30] = ""; cin >> pomocna; if (strlen (pomocna)<=10) { strcpy(auto.jmeno_vyrobce_kratsi,pomocna); } else { strcpy(auto.jmeno_vyrobce_delsi,pomocna); } }