Úvod do objektově orientovaného programování

10. díl - Úvod do objektově orientovaného programování

Petr Sklenička       10. 3. 2011       Architektura       11835 zobrazení

Tento díl slouží jako úvod do objektově orientovaného programování. Je tedy nastíněna základní myšlenka OOP, společně s vysvětlením pojmů objekt a třída. Nechybí ani ukázky kódů a v závěru i krátká zmínka o konstruktoru.

Úvod

V tuto chvíli, po přečtení předchozích dílů tohoto seriálu, by Vám měly být známé nejdůležitější věci jazyka C++ (proměnné, pole, cykly, podmínky atd). Ujistěte se, že jim rozumíte, neboť bez nich se v programování neobejdete. V dnešním díle nás čeká úvod do objektově orientovaného programování, dále jen OOP.

Již z názvu OOP je asi patrné, že se jedná o něco, kde se bude pracovat s objekty. Proto otázka na úvod – co je to objekt? Pod pojmem objekt můžeme chápat téměř vše z reálného světa – auto, člověk, dům, kostka, apod. Snahou OOP je tyto objekty modelovat a pracovat s nimi v programu.

Představte si například nějakou elektronickou součástku, která je složena z nějakého tištěného spoje a všelijakých dalších malých součástek. Celá tato jedna elektronická součást je uzavřena v nějakém plastovém krytu a my ji bez problému můžeme považovat za objekt. Když se na součástku podíváme, nevíme, jak je uvnitř vyrobena, ani co obsahuje. Dejme tomu ale že víme, že součástka slouží k přeměně střídavého proudu na proud stejnosměrný. Je tedy jasné, že budeme-li někdy potřebovat měnit proud střídavý na stejnosměrný, použijeme tuto součástku, aniž bychom věděli, jak přesně funguje.

Na tomto krátkém příkladu jsme si ukázali, co může být například objekt. V programování je to podobné. Každý objekt má nějaké svoje atributy a metody. V případě naší elektronické součástky se atributy rozumí to, co je uvnitř – kondenzátor, diody apod. (nejsem elektrikář, omluvte prosím v tomto směru mou neznalost). Pod pojmem metoda si můžeme představit to, co objekt dělá. Naše součástka mění proud.

V rychlosti si uvedeme ještě nějaký jiný příklad objektu – například auto. Jaké atributy může mít auto? Tak třeba obsah motoru, barva auta, značka, SPZ, rok výroby atd. Co auto umí? Umí se rozjet, zastavit, rozsvítit světla, zatroubit apod. To by mohly být metody auta.

Jak vytvořit v programu nějaký objekt?

K tomu, abychom mohli vytvářet objekty nějakého typu, potřebujeme nejprve třídu. Velmi jednoduše řečeno, třída nám umožňuje vytvářet objekty jednoho typu. Co to znamená? Dejme tomu, že chceme v programu vytvořit několik objektů, které nám budou reprezentovat nějaká auta. Všechny auta se od sebe budou lišit – budou mít jinou značku, jiný výkon, barvu atd. Pořád ale budou mít společné to, že to jsou auta a ne třeba autobusy. Budou se tedy od sebe lišit jen tím, že budou mít jiné hodnoty svých atributů. Potřebujeme tedy třídu Auto. V jazyce C++ by jednoduchá třída Auto mohla vypadat takto:

class Auto
{
    private:
        int rokVyroby;
        int obsahMotoru;
        string barva;

    public:
        void Jet()
        {
            cout << "Auto jede.\n";
        }
        void Zastavit()
        {
            cout << "Auto stoji.\n";
        }
};

Na prvním řádku je klíčové slovo class. Tímto slovem říkáme, že budeme definovat třídu. Za ním následuje název třídy, tedy Auto. Následuje levá složená závorka a klíčové slovo private. V tuhle chvíli se jím nebudeme zabývat, dostaneme se k němu později. Dále jsou tři řádky, kde říkáme, jaké bude mít třída atributy – rokVyroby, obsahMotoru, barva. Poté následuje klíčové slovo public, to také zatím přeskočíme a přejdeme k metodám třídy – Jet a Zastavit. Tyto metody nedělají nic jiného, než že vypisují text. Určitě jste si všimli podobnosti mezi metodami a funkcemi. Dalo by se téměř říct, že metoda není nic jiného, než funkce nějakého objektu. Na konci ukázky je pravá složená závorka a středník – na ten si dávejte pozor, často se na něj zapomíná.

Díky tomuto krátkému kódu by již teď bylo možné vytvořit objekt třídy auto. Nebudeme to však dělat, neboť by nám výsledný objekt k ničemu nebyl. Měli bychom pouze nějaké auto, které by mohlo vypsat, že jede, nebo že stojí. Pojďme si radši společně napsat trochu robustnější třídu, a to třídu Zamestnanec.

Třída, reprezentující zaměstnance

Ještě než se do toho dáme, zmíním, že definici třídy není dobré psát do stejného souboru, v jakém máte funkci main. Je lepší mít pro třídu vyhrazen samotný hlavičkový soubor. Spusťte si tedy Visual Studio, založte nový projekt, vložte si do něj soubor, kde budete mít funkci main a pak do projektu vložte i hlavičkový soubor Zamestnanec.h. To provede tak, že pravým tlačítkem klepnete na Header Files a zvolíte Add –> New Item. Zvolíte Header File (.h), napíšete jeho název (Zamestnanec.h) a kliknete na Add.

image

V souboru Main.cpp si hned napište tento řádek:

#include "Zamestnanec.h"

Nyní se vrátíme do souboru Zamestnanec.h a začneme psát kód třídy. Nejprve si ujasníme, co vlastně má třída reprezentovat. Budeme chtít vytvářet objekty typu Zamestnanec, u kterých budeme chtít jméno, rok narození, výši platu a počet let praxe. To jsou tedy atributy třídy. Co se týče metod, spokojíme se zatím pouze s jednou, která bude sloužit ke zvýšení platu o určitou částku, která se metodě předá. Kód by tedy mohl vypadat přibližně takto:

#include <string>
using namespace std;

class Zamestnanec
{
    private:
        int rokNarozeni;
        int pocetLetPraxe;
        int vysePlatu;
        string jmeno;

    public:
        void ZvysPlat(int castka)
        {
            vysePlatu += castka;
        }
};

Na prvním řádku je #include<string>. Tento řádek je v kódu kvůli tomu, abychom mohli do nějaké proměnné ukládat textový řetězec. Vím, že jsme to ještě neprobírali, bude tomu v budoucnu věnován celý jeden díl. Mohli jsme sice místo stringu použít ukazatel na char, ale nechtěl jsem do toho motat ještě ukazatele a použití stringu je beztak vhodnější. Dále máme již známé using namespace std. Poté následuje samotná třída. Přepněte se nyní do souboru Main.cpp a napište toto:

#include "Zamestnanec.h"

int main()
{
    Zamestnanec A;

    return 0;
}

Zkuste to zkompilovat, pokud jste vše opsali správně, kompilace bude bez problému. Řádkem Zamestnanec A jsme vytvořili objekt třídy Zamestnanec. Všimněte si, že vytvoření objektu nějaké třídy je podobné jako vytvoření nějaké obyčejné proměnné – nejprve typ (int, bool, char, Zamestnanec, …) a pak název. V tuto chvíli máme tedy vytvořen objekt A třídy Zamestnanec. Tento objekt má své atributy (rokNarozeni, pocetLetPraxe, vysePlatu, jmeno) a metody – zatím jen ZvysPlat. Otázkou je, jaká je nyní hodnota atributu vysePlatu či pocetLetPraxe? Rozhodně ne taková, jaká by se dala očekávat – není to ani 0, ani 10 000, zkrátka žádná rozumná hodnota. Proto by asi nebylo až tak úplně od věci již při vytváření nového objektu říct, jaké budou hodnoty jednotlivých atributů. K tomu slouží konstruktor.

Konstruktor

Konstruktor je speciální metoda třídy, která se zavolá při vytváření nového objektu. Od ostatních metod se liší tím, že nemá žádný návratový typ (ani void, prostě nic). Konstruktor se musí jmenovat stejně jako třída – čili v našem případě Zamestnanec. Vraťme se tedy zpět do souboru Zamestnanec.h a upravme kód, aby vypadal takto:

#include <string>
using namespace std;

class Zamestnanec
{
    private:
        int rokNarozeni;
        int pocetLetPraxe;
        int vysePlatu;
        string jmeno;

    public:
        Zamestnanec(int rokNar, int praxe, int plat, string jm)
        {
            rokNarozeni = rokNar;
            pocetLetPraxe = praxe;
            vysePlatu = plat;
            jmeno = jm;
        }
        void ZvysPlat(int castka)
        {
            vysePlatu += castka;
        }
        
};

Přidali jsme konstruktor, kterému předáváme tři celá čísla a jeden textový řetězec. V těle konstruktoru nastavíme atributy na patřičné hodnoty. Opět se vrátíme do main.cpp a objekt A vytvoříme trochu lépe.

#include <iostream>
#include "Zamestnanec.h"

int main()
{
    Zamestnanec A(1980, 7, 23000, "Jan Novak");
    
    return 0;
}

Teď jsme vytvořili zaměstnance A, který se narodil roku 1980, má sedmiletou praxi, bere 23 000 a jmenuje se Jan Novák.

Teď máme vše připravené pro další díl. V tom si vysvětlíme modifikátory přístupu (private, public, popřípadě protected), podíváme se blíže na konstruktory a destruktory a nakonec si budeme hrát s objekty, abyste základní myšlenku OOP co možná nejvíce pochopili.

 

hodnocení článku

9 bodů / 9 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

13. Virtuální metody 1. 2. 2012
12. Dědičnost 24. 7. 2011
11. Konstruktory, destruktory a hrátky s objekty 28. 5. 2011
10. Úvod do objektově orientovaného programování 10. 3. 2011
9. Ukazatele a odkazy, vyhledávání půlením intervalu 26. 1. 2011
8. Funkce 18. 12. 2010
7. Cykly, neboli smyčky - pokračování 19. 11. 2010
6. Cykly, neboli smyčky 26. 10. 2010
5. Pole 13. 7. 2010
4. Relační operátory a podmínky, příkaz switch 29. 6. 2010
3. Proměnné a konstanty 22. 6. 2010
2. První program 15. 6. 2010
1. Úvod, příprava na psaní aplikací v C++ 8. 6. 2010

 

Mohlo by vás také zajímat

Windows Presentation Foundation (WPF) - díl 2.: Architektura WPF – Dispatcher

Znát alespoň obrysy toho, jak funguje unvitř technologie, kterou využíváme je nezbytná nutnost. A právě nižší architektuře WPF se věnuje tento článek - konkrétně objektu Dispatcher.

Windows Azure - díl 5.: Affinity Groups

Affinity Groups dovolují požádat Windows Azure o topologické přiblížení serverů hostujících vaši službu v datových centrech tak, aby byly zajištěny co nejoptimálnější parametry při komunikaci mezi servery.

asp mvc – from zero to hero (4), MVC architektura, view-viewmodel-controller, razor

 

 

Nový příspěvek

 

klobouk i s mozkem

Panečku klobouk i s mozkem smekám. Dlouho mi to dělalo problémy snad nejvíc ta syntaxe oop v c++.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Úvod do objektově orientovaného programování

Super, díky, velmi dobře zpracováno, sice jsem si pořídil knihu Mistrovství v CPP , ale zde ve vašem článku(seriálu) jsou některé věci jsou vysvětleny mnohem lépe. Díky

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za pochvalu. Jinak kniha Mistrovství v C++ je velmi dobrá, najdete v ní spoustu zajímavých věcí, je toho v ní opravdu dost. Další skvělá kniha o C++ je Naučte se C++ za 21 dní, která sice není až tak obsáhlá jako Mistrovství v C++, ale zase jsou v ní některé věci vysvětleny na jednodušších příkladech (například objekty, třídy apod...).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano, to já vím, také jsem o ní uvažoval, ale nakonec jsem se rozhodl pro MvC++ , má sice +1000 stran, ale dá se to naučit, s programováním teprve začínám(předtím jsem prog. ve VB.NET a něco málo v C#), v MvC++ je toho opravdu dost, ale něco se tam až moc "Okecává", i proto je podle mě třeba OOP vysvětleno ve vašem článku vysvětleno stejně kvalitně, přitom krátce, jen je škoda, že tento web trošku "Usína", nebýt vašeho článku, už by tu více jak měsíc nebyl nový článek...Ještě jednou díky :-)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak isto ako si popisoval ze je to velmi zdlhavo pisane v MvC++ tak je to aj v Naucte se C++ za 21 dni (nwm ci az tak velmi alebo menej kedze som tu tvoju necital ale je to dost obkecavane ze v tom velmi lahko stratis prehlad) preto som hladal na internete aby som to nasiel jednoduhsie a toto je fakt skvely clanok za ani nie 10 min som pochopil to co som tam nepochopil za asi 3 hod. co je skvele len keby tento serial bol aktualizovany aspon kazde 2 dni (nove diely) pretoze ked precitam este zvysne 2 diely musim sa vrati t naspet na tu knihu kde je to velmi zdlhavo pisane a je to trosku problem ale myslim si ze OOP je asi najtazsie takze ked to zvladnem tak by to malo byt potom uz ok ci? :)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

V první řadě jsem rád, že pro Vás byl článek přínosný.

Co se týče OOP, tak to zase tak těžké není a hlavně je to základ. Až zvládnete techniky a principy OOP, je třeba pokračovat s dalšími věcmi. A to už pak záleží na Vás, co vlastně chcete dělat. Jestli například budete chtít programovat "low-level" věci, nebo třeba nějaké rozsáhlé informační systémy (v tom případě asi C++ nebude to pravé).

Jinak tento seriál ještě nekončí, byť to tak možná vypadá. Je pravda, že jsem opravdu hodně dlouho nenapsal žádný díl, ale určitě ještě další díly budou. Je toho hodně, co v článcích ještě nebylo řečeno (tím myslím základy, všechno popsat pochopitelně nelze). Jen pro představu, po dokončení OOP by mohly následovat témata jako třeba práce s bity, seznámení se se standardní knihovnou šablon, kde je možno podívat se na to, co je zásobník, fronta, seznam apod. Dále například práce s výjimkami a mnoho dalších, dle mého základních technik. Rád bych tedy ještě několik dílů napsal, ale co dva dny psát nový díl, to určitě nepůjde. Cílem seriálu je tedy poskytnout nějaký ucelený základ programování v C++.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Naozaj skvely clanok - mal by som osobny dotaz mozeme sa spojit emailom ?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Teoreticky to problém není. Zajímá mě ale, proč se chcete spojit přes email - pokud máte nějaký dotaz ohledně C++, bude lepší, pokud se zeptáte v diskusi.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback