Ú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.
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.