headerphoto

Objektově orientované programování (OOP)

Základem OOP je práce s objekty. Objekt je odlišitelný od ostatních objektů a má nějaké vlastnosti a schopnosti. Objektem může být auto, strom, zaměstnanec, okno nebo tlačítko v operačním systému. Uživatel objektu přistupuje k jednotlivým objektům jako k "černým skříňkám". Nezajímá se, jakým způsobem objekty služby poskytují, ale zajímá se jen, jaké služby poskytují a jak je může použít.

Obecným popisem pro objekty stejné skupiny je třída. Třída je vlastně předpisem, jak vytvořit objekt.Jednotlivé objekty každé třídy nazýváme instance třídy.

class NazevTridy [: předchůdci třídy]  //předchůdce určujeme v případě dědičnosti
{
// Položky třídy
};

Jedním ze základních pilířů OOP je tzv. zapouzdření, tedy uchovávat si atributy třídy pro sebe a ven vystavovat jen metody. K tomu použijeme nastavení public a private.

Ve třídě definujeme její položky t.j. datové prvky (proměnné) a metody (členské funkce). Položky mohou být:
- soukromé (private), např. proměnné třidy, ke kterým mají přístup jen metody dané třídy
- veřejné (public), přístupné v programu, vytvářejí rozhraní pro praci s objektem
- chráněné (protected)

Je dobrým zvykem nastavit všechna data (členské proměnné) jako soukromé a vytvořit k nim přístupové veřejné metody (pro nastavení nebo získání hodnoty). K soukromým položkám se totiž dostaneme přímo ve všech metodách dané třídy, ale mimo tuto třídu musíme vždy použít odpovídající přístupovou metodu.

   // příklad definice třídy  
   class Vozidlo      
  {                     
    private:           
       string Spz;   
       int RokVyroby;  
              
    public:                  
       bool NastavSpz(const string s);        //nastaví (změní) SPZ
       void NastavRokVyroby(int rv);    //nastaví (změní) rok výroby     
       string DejSpz() const;       //vrátí SPZ, nemění atributy třídy  
       int DejRokVyroby() const;    //vrátí rok výroby, nemění atributy třídy
   };            
  
   

Při definici třídy jsme uvedli jenom hlavičky metod, je potřebné metody ještě definovat (uvést jejich kompletní kód). Je možné je definovat přímo ve třídě (inline), ale u složitějších tříd je potom zápis nepřehledný. Dále je uveden příklad definice metody mimo třídu. Operátor :: označuje příslušnost metody ke třídě.

    bool Vozidlo::NastavSpz(const string s)
    {
      if(s.length()>8) return false;        //jednoduché ošetření pro SPZ
      this->Spz = s;
      return true; 
    }
    
    void Vozidlo::NastavRokVyroby(int rv)
    {
      this->RokVyroby = rv;
    }

    string Vozidlo::DejSpz() const
    {
      return this->Spz; 
    }
    
    int Vozidlo::DejRokVyroby() const
    {
      return this->RokVyroby; 
    }
  

V případě vytváření projektu bude definice třídy v hlavičkovém souboru a definice členských funkcí dáme do odpovídajícího zdrojového kódu.

Instance pro jednotlivé třídy vytváříme podobně jako "proměnnou pro danou třídu". K jednotlivým položkám přistupujeme přes operátor tečka (u statických instancí) nebo přes operátor -> (v případě ukazatelů). Soukromé položky nejsou přístupné přímo, jenom přes metody.

    int main()
    {
        Vozidlo prvni, druhe;
        
        cout << "Prvni auto: " ;
        prvni.NastavSpz("1T2 3333");
        cout << prvni.DejSpz() << endl;
        
        cout << "Druhe auto: " ;
        if(druhe.NastavSpz("1T2 3333"))     //s vyuzitim osetreni SPZ
        {
          cout << druhe.DejSpz() << endl;
        }
        else
        {
          cout << "spatna SPZ " << endl; 
        }
        
        return 0;
    }
    

Instance třídy lze vytvářet taky dynamicky.


Design downloaded from Free Templates - your source for free web templates