Programovanie (1) v C/C++
1-INF-127, ZS 2024/25
Letný semester, prednáška č. 2: Rozdiel medzi revíziami
Riadok 66: | Riadok 66: | ||
Premenná, ktorej typom je trieda, obsahuje ''referenciu'' na objekt, ktorý je inštanciou tejto triedy. | Premenná, ktorej typom je trieda, obsahuje ''referenciu'' na objekt, ktorý je inštanciou tejto triedy. | ||
* Podľa toho sa teda správajú operátory <tt>=</tt> a <tt>==</tt>. | * Podľa toho sa teda správajú operátory <tt>=</tt> a <tt>==</tt>. | ||
+ | * K premenným a metódam objektu, na ktorý príslušná referencia ukazuje, pristupujeme pomocou operátora <tt>.</tt> a píšeme napríklad <tt>fraction.numerator</tt> alebo <tt>fraction.evaluate()</tt>. | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Fraction fraction1, fraction2; | Fraction fraction1, fraction2; | ||
Riadok 74: | Riadok 75: | ||
fraction1.numerator = 3; // Zmeni sa aj hodnota fraction2.numerator. | fraction1.numerator = 3; // Zmeni sa aj hodnota fraction2.numerator. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
=== Konštruktory a inicializácia objektov === | === Konštruktory a inicializácia objektov === |
Verzia zo dňa a času 13:15, 19. február 2021
Obsah
Oznamy
- Na test pre pokročilých sa v prípade záujmu treba prihlásiť do utorka 23. februára, 11:30.
- Prvú bonusovú úlohu treba odovzdať do stredy 24. februára, 11:30.
Základné koncepty objektovo orientovaného programovania
Objekty a triedy
Dvoma najzákladnejšími konceptmi objektovo orientovaného programovania (OOP) sú triedy a objekty.
- Trieda (angl. class) je typ, ktorý podobne ako struct v C/C++ môže združovať údaje rôznych typov. Okrem toho ale obvykle obsahuje aj definície metód na manipuláciu s týmito údajmi.
- Objekt (angl. object) je inštancia triedy – obsahuje teda už nejakú konkrétnu sadu údajov vyhovujúcu definícii triedy, na ktorú možno aplikovať metódy triedy.
- Triedu teda možno chápať ako „vzor”, podľa ktorého sa vytvárajú objekty.
Príklad: nasledujúca trieda Fraction reprezentuje jeden zlomok. Obsahuje dve premenné numerator a denominator zodpovedajúce čitateľu a menovateľu zlomku a metódu na vyhodnotenie zlomku.
public class Fraction {
int numerator;
int denominator;
double evaluate() {
return (double) numerator / denominator;
}
}
Inštanciami tejto triedy, t.j. objektmi typu Fraction, sú konkrétne realizácie triedy Fraction (napr. zlomok s čitateľom 2 a menovateľom 3). O spôsobe ich vytvorenia si povieme o chvíľu. Avšak v prípade, že už máme nejakú inštanciu fraction triedy Fraction vytvorenú, môžeme hodnotu zlomku vypísať napríklad nasledovne:
Fraction fraction;
// Sem pride vytvorenie instancie triedy Fraction a jej priradenie do premennej fraction.
System.out.println(fraction.evaluate());
Príklad: časť triedy reprezentujúcej zásobník implementovaný pomocou poľa (čo je v Jave značne suboptimálne riešenie) by mohla vyzerať napríklad nasledovne.
public class MyStack {
int data[];
int pocet;
int pop() {
pocet--;
return data[pocet];
}
// Dalsie metody (napr. push) ...
}
Ak si opäť odmyslíme vytvorenie samotného zásobníka, môžeme so zásobníkom typu MyStack pracovať napríklad takto:
MyStack stack;
// Sem pride vytvorenie zasobnika a napriklad niekolko prikazov push.
int x = s.pop();
Neskôr uvidíme, že medzi štandardnými triedami jazyka Java možno nájsť aj množstvo dátových štruktúr a medzi nimi aj triedu Stack pre zásobníky. Príklad vyššie je teda iba ilustračný a tvorbe tried podobného druhu je vo všeobecnosti lepšie sa vyvarovať.
Príklad: v Jave sú všetky typy okrem primitívnych triedami a ich inštancie sú teda objektmi. S výnimkou veľmi špecifického prípadu polí (o ktorom si viac povieme neskôr) pôjde o triedy a objekty v podobe, v akej si ich predstavíme na tejto prednáške.
Referencie na objekty
Premenná, ktorej typom je trieda, obsahuje referenciu na objekt, ktorý je inštanciou tejto triedy.
- Podľa toho sa teda správajú operátory = a ==.
- K premenným a metódam objektu, na ktorý príslušná referencia ukazuje, pristupujeme pomocou operátora . a píšeme napríklad fraction.numerator alebo fraction.evaluate().
Fraction fraction1, fraction2;
// ...
fraction1 = fraction2; // Obidve premenne ukazuju na to iste miesto v pamati.
fraction1.numerator = 3; // Zmeni sa aj hodnota fraction2.numerator.