Třída je nový typ. Objekt je proměnnou daného typu. Např. Matrix aaa znamená, že proměnná aaa je objektem třídy Matrix.


Proměnná je objektem pokud je typu struktura nebo třída. Z hlediska popisovaných mechanizmů se chovají stejně. Jedná se o snahu sdružit příbuzné data a metody do jednoho logického celku. To znamená: proč něco co spolu souvisí držet odděleně, když se s tím pracuje jako s celkem? Cílem je zpřehlednění programu a to jak z  hlediska volání tak psaní, hlavně z důvodů kolizí jmen proměnných a funkcí.

Další výhodou, kterou si necháme na později je dědění, což je možnost několikanásobného využití kódu.


Ze známých věcí má objekt nejblíže ke knihovně. Vezměmě např. ovladače k perifernímu zařízení (nebo jinou knihovnu jazyka C) – v hlavičkovém souboru jsou deklarace rozhraní (tj. To co lze v dané knihovně uživatelsky využít), zdrojový kód bývá nejčastěji reprezentován souborem tyup obj, lib, dll. To vše se týká určitého logického celku. Pro problém nesouvisející je vytvořena knihovna jiná.


Objektové programování je vlastně možnost jak si nadefinovat vlastní typ (jako je int, float, …), který se skládá z dat a metod pracujících s těmito daty (tj. jako u struktury v C – složený typ, který si v sobě nese data ale v C++ také metody pracující s daty). Oproti standardním typům má i některé vlastnosti navíc. Jelikož se jedná o tvorbu nového typu, znamená to, že třída je vlastně nová knihovna, která má ulehčit práci – ve vlastním programu se u proměnných daného typu pracuje nejen s daty v nadefinovaných proměnných ale i s nadefinovanými vlastnostmi pro tyto typy. Měla by tedy být opravdu logickým (i faktickým) sdružením dat a metod, které k sobě patří – v případě, kdy potřebujeme s daty pracovat, vezmeme třídu a máme i všechny potřebné metody. Pokud by některá data zůstávala nevyužita, volíme raději tvorbu dvou tříd, kdy druhá (rozšířená) bude vytvořena (děděním) jako potomek třídy první (která by měla být nejobecnější pro danou skupinu dat).


Pro všechny členy (data a metody) je možné určit přístupová práva, to znamená určit, zda s nimi mohou pracovat pouze metody dané třídy, nebo jsou dosažitelné i pro uživatele z venku. To znamená že přístup k datům a.data, nebo k metodám a.metoda( ) se může použít pouze při tvorbě metod dané třídy (v případě privátního přístupu) nebo i pro práci i mimo třídu (v případě public – veřejného přístupu. Tento přístup odpovídá práci se strukturami).


Při rozboru nutném pro definici třídy je nutné uvažovat následující kategorie:

  1. vznik – při programování se jedná o definici nebo definici s inicializací popř. o předávání hodnotou do a z funkce. Mechanizmus se nazývá konstruktor. Nejčastěji se uvažuje vznik bez parametrů a vznik z prvku stejného typu.

  2. zánik – ukončení života proměnné. Mechanizmus se nazývá destruktor. Uvolnění zdrojů (paměť, soubory …), uložení dat.

  3. nastavení – jak a které proměnné třídy bude za chodu možné nastavovat. Metody.

  4. vyčítání – jak a u kterých proměnných třídy bude možno zjišťovat jejich stav. Metody (a operátory).

  5. manipulace – jak a které proměnné se budou měnit. Metody a operátory.

  6. vstup a výstup – pomocí streamů. V jaké formě se budou data ukládat a načítat (z hlediska archivace i uživatele)


Dalším, i když méně šťastným, přístupem jak tvořit popis třídy je “napsat” kód, který má “umět”. Na základě něho potom provést rozbor, které mechanizmy je třeba ve třídě implementovat (napsat).


Třída se skládá ze dvou částí – svého prototypu a metod (tj. kódu). Prototyp – definice třídy (tj. nového typu) obsahuje data a prototypy metod třídy s jejich přístupovými právy (netvoří kód, je to pouze předpis pro vytvoření proměnné dané třídy a práci s ní) – tento bývá uveden v hlavičkovém souboru, aby bylo možné třídu použít v různých modulech. Metody, které tvoří kód jsou potom ve zdrojovém souboru. Musíme k nim ovšem napsat ke které třídě patří. Při definici se to pozná uvedením jména třídy s operátorem příslušnosti před název funkce – např. Komplex::Realna(). Při volání se správná funkce (tj. ke které třídě patří) určí podle typu proměnné, která ji vyvolala - a.Realna().


V metodách třídy vyvolaných proměnnou (v a.Realna() vyvolaných proměnnou a) je tato proměnná jako implicitní parametr, ostatní parametry je možné předat explicitně (se svými proměnnými tedy objekt, který metodu vyvolal pracuje “přímo” nebo pomocí ukazatele this (tak se jmenuje ten implicitní parametr, kterým se předá proměnná do metody kterou vyvolala), s předanými parametry metoda třídy pracuje “klasicky” – jako u funkcí v C ).


Pro vznik se používají tzv. konstruktory. Konstruktor je volán v místě definice proměnné daného typu a je to zaručeně první metoda, která se pro daný objekt volá. Proto slouží k inicializaci objektu. Nejpoužívanější je konstruktor bez parametru, který většinou jen nastaví proměnné na počáteční – “neutrální” stav. Dále pak tzv. “kopykonstruktor”, který vytvoří objekt jako kopii již existujícího prvku dané třídy. Je ovšem možný konstruktor s libovolnými parametry. Definice proměnných potom může vypadat např. Komplex a, b = a, b (3 , 8);.


Jak je vidět, konstruktorů je několik a budou se jmenovat stejně – tato vlastnost, která je v C++ nová se nazývá přetížení a znamená, že můžeme mít více funkcí stejného jména pokud zajistíme, že překladač dokáže vybrat tu správnou na základě (počtu nebo typu předávaných) parametrů.


Pro zánik se používá tzv. destruktor. Je to poslední funkce, která se volá před zánikem objektu a proto slouží k “uklizení”, kterým bývá vrácení zdrojů (paměť, soubory …) nebo uložení dat.


Pro manipulaci s daty se tvoří metody a operátory. Jelikož operátory mají i funkční volání, jedná se vlastně o zvláštní typ metod. Např. zkrácený zápis a = b + c má funkční volání a.operator=(b.operator+(c)). Manipulačních funkcí používáme k nastavení dat, zjištění v jakém stavu data jsou a k práci s daty. K datům se snažíme nepřistupovat přímo ale právě přes metody. Důvodem je, že tímto si necháváme v záloze možnost měnit typ dat aniž by se to projevilo vně – napíšeme pouze “konverze” do funkcí, které je nutné používat k přístupu.









Poslední změna 2005-10-18