Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Vytváření tříd, instance třídy, zasílání zpráv v C++
28. prosince 2000, 00.00 | V minulém článku jsem vysvětlil základní pojmy z OOP. Nyní bych chtěl ukázat jak vše implementovat v C++.
Vytváření tříd, instance třídy, zasílání zprávV minulém článku jsem vysvětlil základní pojmy z OOP. Nyní bych chtěl ukázat jak vše implementovat v C++. V tomto článku, i ve všech ostatních, již nebudu vysvětlovat význam jednotlivých pojmů, ale jen ukážu jak je implementovat v C++. Budete-li mít nějaké nejasnosti, doporučuji vám si přečíst můj předchozí článek.
Jak vytvořit (definovat) třídu?K vytvoření třídy slouží klíčové slovo class. Definice vypadá následovně:
|
Tato definice třídy není jediná. Mně se zdá nejlepší, proto ji budu dále používat. Třída je v C++ velmi podobná struktuře a také jsou k dispozici stejné možnosti pro vytváření třídy a struktury.
V tomto článku se dále nebudeme zabývat nepovinnou částí [: předchůdci třídy] . Týká se dědičnosti, které chci věnovat dva jiné články. Položky třídy jsou proměnné, nebo metody. 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 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í. Budu se snažit chráněné položky nepoužívat, ale v praxi se v C++ někdy zapouzdření porušit musí.
Příklad třídy:
|
V této definici třídy jsem deklaroval hlavičky metod. Mohl jsem napsat těla metod hned v definici třídy. U větších tříd by takový zápis nebyl příliš přehledný. Také každá metoda, jejíž tělo je definováno v definici třídy je překládána, jako inline. Význam klíčového slova inline je stejný jako v C. 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. Jen bych ještě měl upozornit, že slovo inline není pro překladač nijak závazné a pokud překladač "neuzná" za vhodné funkci překládat jako inline, tak ji přeloží normálně.
Nyní zbývá definovat těla metod:
|
V těle této metody je proměnná a lokální. 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 mohu také použít globální proměnné, kdyby nějaké byly.
|
V čistě objektově orientovaném programu neexistují globální funkce, ale jen metody. V C++ je trochu problematické napsat čistý objektově orientovaný program. Už jen proto, že funkce main je globální funkcí, není metodou žádné třídy.
Instance třídy
Procesu vytváření a rušení tříd věnuji celý příští článek. Zatím jen pro jednoduchou ilustraci naší jednoduché třídy vytvoříme instanci následujícím způsobem: MojePrvniTrida mojeprvniinstance;. Tedy stejně jako by jsme definovali "proměnnou typu MojePrvniTrida".
Objektu se zašle zpráva (Vyvolá se jeho metoda.) následujícím způsobem:
|
Vyvolá se metoda, nebo se zašle zpráva? Jedná se jen o takové hraní si se slovíčky. V minulém článku jsem uvedl, že objekt na zprávu reaguje vyvoláním své metody. Podle teorie se objektům zasílají zprávy. Objekt na zprávu zareaguje voláním metody. Klidně tomu ale můžeme říkat zavolání metody. Nikomu snad nebude vadit, že přesně nedodržuji terminologii. Nyní příklad: (Napište před funkci main definici třídy a defici metod uvedené výše.)
|
Ve svém prvním článku stejně jako zde používám zápis cout << něco, aniž bych vysvětlil o co jde. Vstupně výstupním operacím se chci věnovat v jednom svém článku podrobně. Zatím prosím berte jako fakt, že "to funguje" a že to něco vypíše. Nechcete-li psát něco, co neznáte, můžete zatím používat funkci printf z C knihovny stdio.h.
Implicitní parametr "this"
Každá metoda v C++ je volána s tak zvaným implicitním parametrem
|
V příštím článku se podrobně podívám jak vytvářet a rušit instance. Povím něco o konstruktorech, destruktorech, operátorech new, delete, atd.
Obsah seriálu (více o seriálu):
- Základy OOP v C++: Od C k C++
- Základní pojmy objektově orientovaného programování
- Vytváření tříd, instance třídy, zasílání zpráv v C++
- Vytváření instancí - konstruktory, destruktory
- Kopírovací konstruktor v C++
- Jednoduchá dědičnost v C++
- Časná versus pozdní vazba - úvod do polymorfismu v C++
- Polymorfismus - dokončení
- Vícenásobná dědičnost v C++
- Vícenásobná dědičnost v C++ - opakovaná dědičnost
- Vícenásobná dědičnost v C++ - volání konstruktorů a destruktorů
- Přetěžování operátorů v C++ 1.díl
- Přetěžování operátorů v C++ 2. díl
- Vstupní a výstupní operace pomocí datových proudů v C++
- Přetěžování operátorů << a >> pro datové proudy v C++
- Neformátovaný vstup a výstup v C++
- Paměťové proudy v C++
- Prostory jmen v C++
- Řetězce v C++
- Výjimky v C++
- Výjimky v C++ - výjimky tvoří dědičnou hierarchii
- Výjimky v C++ - dokončení
- Dynamická identifikace typů v C++
- Přetypování v C++
- Problémy s typy při vícenásobné dědičnosti
- Šablony funkcí v C++
- Šablony datových typů v C++
- Vnitřní typy u parametrů šablon, vnořené šablony v C++
- Pole s libovolným intervalem indexování v C++
- Datové kontejnery v C++ - Úvod do STL
- Vector - datový kontejner v C++
- Iterátory v C++
- Šablona vector v C++ a iterátory
- Asociativní pole v C++
- Množina v C++
- Funkční objekty v C++
- Standardní funkční objekty v C++
- Úvod do standardních algoritmů v C++
- Kopírovací a přesouvací algoritmy v C++
- Vyhledávací algoritmy v C++
- Skenovací (prohlížecí) algoritmy v C++
- Transformační algoritmy v C++
- Řadící algoritmy v C++
- Halda v C++
- Standardní algoritmy v C++ - dokončení
- Automatické ukazatele v C++
- Inteligentní ukazatel - čítač referencí v C++
- Použití čítače referencí v C++
- Kopírování velkých objektů v C++
- Řízené kopírování prvků v poli v C++
- Dokončení seriálu objektově orientované programování v C++
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007