Hledejte v chronologicky řazené databázi studijních materiálů (starší / novější příspěvky).

25. Objektové typy v C++, typy struktura, třída a unie.

Struktura viz otázka č. 16

Datový typ union:
Druhým datovým typem, o kterém dnes bude řeč, je union. Union si lze jednoduše představit jako obyčejnou strukturu, kde ale všechny její položky sdílejí jedno paměťové místo, tedy se překrývají (jsou na stejné adrese). Zatímco u obyčejných struktur bylo pro každou položku alokováno zvláštní místo v paměti, v případě unionů je tedy alokováno místo pouze pro největší z nich.

Definice unionů je prakticky shodná s definicí struktur:

union UN{
char c;
int pocet;
double delka;
};

Protože se jednotlivé prvky unionu překrývají, je jasné, že po přiřazení hodnoty některému z nich se dá pracovat již pouze s tímto prvkem, a to až do doby, kdy dojde k novému přiřazení. V opačném případě bychom pracovali s „deformovanými“ daty (i když i tato vlastnost se dá v některých případech patřičně využít). Zde se projeví nevýhoda unionů, které neuchovávají informaci o tom, který jejich prvek je právě využíván. Možností, jak toto obejít, je zabalit union do další struktury obsahující navíc položku s informací (např. číselnou) o právě používaném prvku unionu:

struct UNIE{
int info;
UN x;
};

Třídy (class) - vytváření tříd:
Definice třídy
K vytvoření třídy slouží klíčové slovo class. Definice vypadá následovně:

class NázevTřídy [: předchůdci třídy]
{ Položky třídy };

Tato definice třídy není jediná. Třída je v C++ velmi podobná struktuře a také jsou k dispozici stejné možnosti pro vytváření třídy a struktury.

[: předchůdci třídy] je nepovinná část, která se týká dědičnosti(viz otázka č. 29). Položky třídy jsou proměnné, nebo metody(vztahuje se k následující otázce č. 27). Pojmu metoda se v C++ také někdy říká členská funkce (Member function). Metoda je vlastně funkce, která není globální, ale je volatelná jen v souvislosti s instancemi dané třídy. Položky(týká se přístupových práv z otázky č. 28) mohou být soukromé(private), chráněné(protected) a veřejné(public).

Soukromé položky mohou být proměnné, ke kterým mají přístup pouze metody dané třídy, nebo metody, které mohou být volány jen jinými metodami dané třídy.

Naopak veřejné položky může využívat kdokoliv. Veřejné položky tvoří rozhraní objektu dané třídy. Soukromé položky jsou zapouzdřeny, a přístup k nim se provádí jen přes veřejné rozhranní. Jako veřejné položky by neměli být proměnné, protože by docházelo k porušení zapouzdření. V praxi se ale na zapouzdření někdy moc nehledí. Chráněné položky jsou vlastně soukromé položky, které se někdy chovají jako veřejné. Jako veřejné se chovají k tak zvaným přátelským funkcím a vůči instancím tak zvaných přátelských tříd. Použití chráněných položek je vlastně také porušení zapouzdření.

Příklad třídy:

class MojePrvniTrida
{
private: /* Následující položky jsou soukromé.*/
int Cislo;
char Znak;
public: /* Následující položky jsou veřejné.*/
int VratMiTvojeCislo();
void NastavSiCislo(int noveCislo);
};

V této definici třídy jsou deklarovány hlavičky metod. Mohli bychom napsat těla metod hned v definici třídy, ale u větších tříd by takový zápis nebyl příliš přehledný.
Nedůležité: Také každá metoda, jejíž tělo je definováno v definici třídy je překládána, jako inline. Tedy funkce (nebo metoda) nebude volána, ale překladač vloží její tělo na místo jejího zavolání. Inline metoda je něco jako-by makro. Na rozdíl od makra, které je vkládáno na úrovni zdrojového textu, je inline funkce vkládána na úrovni přeloženého binárního kódu.
Inline není pro překladač závazný!

Definice těla metod:
int MojePrvniTrida::VratMiTvojeCislo()

/* Operátor :: (čtyř-tečka) oznamuje překladači, že VratMiTvojeCislo() není globální funkce, ale členská metoda danné třídy.*/
{
int a = 3; /* Ukázka lokální proměnné*/
return Cislo;
}

V těle této metody je lokální proměnná. Proměnná Cislo je proměnná, která je definována v třídě. Každá instance této třídy bude obsahovat svou proměnnou Cislo. V těle metod můžeme také použít globální proměnné, kdyby nějaké byly.

void MojePrvniTrida::NastavSiCislo(int noveCislo)
{
Cislo = noveCislo;
}

V čistě objektově orientovaném programu neexistují globální funkce, ale jen metody. V C++ je trochu problematické napsat čistý objektově orientovaný program(proto je ideální např. Java). Už jen proto, že funkce main je globální funkcí, není metodou žádné třídy.

Žádné komentáře:

Okomentovat