01
z 09
Začínajúce triedy C ++
objektov sú najväčší rozdiel medzi C ++ a C. Jedným z prvých mien pre C ++ bol C s triedami.
Triedy a objekty
Trieda je definícia objektu. Je to typ ako int. Trieda sa podobá a struct s jediným rozdielom: predvolene sú všetci členovia štruktúr verejní. Všetci členovia tried sú súkromní.
Pamätajte - trieda je typ a objekt tejto triedy je iba premenlivý.
Predtým, ako budeme môcť použiť objekt, musí byť vytvorený. Najjednoduchšia definícia triedy je:
názov triedy {
// členovia
}
Táto vzorová trieda nižšie predstavuje jednoduchú knihu. Pomocou OOP môžete problém abstraktne premýšľať a premýšľať o ňom, nielen o ľubovoľných premenných.
// príklad jedna
#include
#include
triedna kniha
{
int PageCount;
int CurrentPage;
public:
Kniha (int Numpages); // Konštruktor
~ Book () {}; // Destruktor
void SetPage (int PageNumber);
int GetCurrentPage (neplatné);
};
Kniha:: Kniha (int NumPages) {
PageCount = NumPages;
}
void Book:: SetPage (int PageNumber) {
CurrentPage = PageNumber;
}
int Book:: GetCurrentPage (neplatné) {
return CurrentPage;
}
int main () {
Kniha ABook (128);
Kniha. SetPage (56);
std:: cout << "Aktuálna stránka" << ABook. GetCurrentPage () << std:: endl;
návrat 0;
}
Celý kód z učebnica dole na int Book:: GetCurrentPage (neplatné) { funkcia je súčasťou triedy. Hlavná() Funkcia je tam, aby sa táto spustiteľná aplikácia.
02
z 09
Pochopenie triedy knihy
V Hlavná() je vytvorená premenná ABook typu Book s hodnotou 128. Akonáhle vykonávanie dosiahne tento bod, skonštruuje sa objekt ABook. Na ďalšom riadku je metóda Kniha. SetPage () sa volá a hodnota 56 je priradená k premennej objektu Kniha. Aktuálna stránka. potom cout výstupy tejto hodnoty volaním Kniha. GetCurrentPage () metóda.
Keď vykonanie dosiahne návrat 0; objekt ABook už aplikácia nepotrebuje. Kompilátor generuje volanie do deštruktora.
Deklarovanie tried
Všetko medzi tým Učebnica a } je vyhlásenie triedy. Táto trieda má dvoch súkromných členov, obidva typu int. Sú súkromné, pretože predvolený prístup k členom triedy je súkromný.
public: smernica hovorí prekladač prístupy odtiaľto sú verejné. Bez tohto by to bolo stále súkromné a zabránilo by trom riadkom v hlavnej funkcii () v prístupe k členom Abook. Skúste pridať komentár public: line line a recompiling vidieť následné kompilácie chyby.
Tento riadok nižšie deklaruje staviteľa. Toto je funkcia, ktorá sa volá pri prvom vytvorení objektu.
Kniha (int Numpages); // Konštruktor
Volá sa z linky
Kniha ABook (128);
Takto sa vytvorí objekt s názvom ABook typu Book a volanie funkcie Book () pomocou parameter 128.
03
z 09
Viac o triede kníh
V C ++ má konštruktor vždy rovnaký názov ako trieda. Konštruktor sa volá pri vytvorení objektu a je to miesto, kam by ste mali vložiť kód na inicializáciu objektu.
V knihe Ďalší riadok za konštruktorom deštruktor. Toto má rovnaké meno ako konštruktér, ale pred ním je ~ (vlnovka). Počas deštrukcie objektu sa volá deštruktor, aby objekt uklizol a zabezpečil uvoľnenie prostriedkov, ako sú pamäť a popisovač súboru použité v objekte.
pamätať- trieda xyz má konštruktorovú funkciu xyz () a destruktorovú funkciu ~ xyz (). Aj keď to nevyhlásite, kompilátor ich ticho pridá.
Deštruktor sa vždy volá, keď je objekt ukončený. V tomto príklade je objekt implicitne zničený, keď vyprší rozsah. Ak to chcete vidieť, upravte vyhlásenie deštruktora takto:
~ Book () {std:: cout << "Destructor nazvaný";}; // Destruktor
Toto je inline funkcia s kódom v deklarácii. Iným spôsobom vloženia je vloženie slova vloženia
inline ~ Kniha (); // Destruktor
a pridať deštruktor ako funkciu, ako je táto.
vložená kniha:: ~ Kniha (neplatné) {
std:: cout << "Destructor nazvaný";
}
Inline funkcie sú rady pre kompilátor na vygenerovanie efektívnejšieho kódu. Mali by sa používať iba na malé funkcie, ale ak sa používajú na vhodných miestach - napríklad vo vnútri slučky— Môžu výrazne zmeniť výkon.
04
z 09
Metódy písania tried
Najlepší tréning pre objekty znamená, že všetky údaje budú súkromné a budú k nim pristupovať prostredníctvom funkcií známych ako prístupové funkcie. SetPage () a GetCurrentPage () sú dve funkcie používané na prístup k premennej objektu Aktuálna stránka.
Zmeniť trieda deklarácia na štruktúrovanie a kompiláciu. Mal by sa stále kompilovať a správne spúšťať. Teraz dve premenné PageCount a Aktuálna stránka sú verejne prístupné. Pridajte tento riadok za knihu Book ABook (128) a skompiluje sa.
Kniha. PageCount = 9;
Ak zmeníte štruktúru späť na trieda a prekompiluje sa, že nový riadok sa už nebude kompilovať ako PageCount je teraz opäť súkromný.
The:: Notation
Po vyhlásení tela triedy knihy sú štyri definície členských funkcií. Každá z nich je definovaná s predponou Book::, aby ju identifikovala ako príslušnosť k tejto triede.:: sa nazýva identifikátor rozsahu. Identifikuje funkciu ako súčasť triedy. Toto je zrejmé vo vyhlásení triedy, ale nie mimo neho.
Ak ste v triede deklarovali funkciu člena, musíte týmto spôsobom poskytnúť telo funkcie. Ak chcete, aby triedu Kniha používali iné súbory, môžete presunúť vyhlásenie knihy do samostatného súboru hlavička súbor, pravdepodobne nazývaný book.h. Akýkoľvek iný súbor by ho potom mohol zahrnúť do
#include „book.h“
05
z 09
Dedičstvo a polymorfizmus
Tento príklad preukáže dedičstvo. Jedná sa o dvojtriedovú aplikáciu, pričom jedna trieda je odvodená od inej.
#include
#include
triedy Point
{
int x, y;
public:
Bod (int atx, int aty); // Konštruktor
inline virtual ~ Point (); // Destruktor
Virtuálne prázdno Draw ();
};
class Circle: public Point {
vnútorný polomer;
public:
Circle (int atx, int ,ty, int theRadius);
inline virtual ~ Circle ();
Virtuálne prázdno Draw ();
};
Point:: Point (int atx, int aty) {
x = atx;
y = aty;
}
inline Point:: ~ Point (neplatné) {
std:: cout << "Point Destructor nazvaný";
}
void Point:: Draw (void) {
std:: cout << "Point:: Draw point at" << x << "" << y << std:: endl;
}
Circle:: Circle (int atx, int aty, int theRadius): Bod (atx, aty) {
polomer = radius;
}
inline Circle:: ~ Circle () {
std:: cout << "Circle Destructor s názvom" << std:: endl;
}
void Circle:: Draw (void) {
Bod:: Kresliť ();
std:: cout << "circle:: Draw point" << "Radius" << radius << std:: endl;
}
int main () {
Kruhový kruh (10,10,5);
Kruh. Nakresliť ();
návrat 0;
}
Príklad má dve triedy: Bod a Kruh, ktoré modelujú bod a kruh. Bod má súradnice xay. Trieda Kruh je odvodená od triedy Point a pridáva polomer. Obe triedy zahŕňajú a Draw () funkcia člena. Aby bol tento príklad krátky, výstupom je iba text.
06
z 09
dedičstvo
Trieda kružnice je odvodený z bod trieda. To sa deje v tomto riadku:
class Circle: Point {
Pretože je odvodený zo základnej triedy (Point), Circle dedí všetkých členov triedy.
Bod (int atx, int aty); // Konštruktor
inline virtual ~ Point (); // Destruktor
Virtuálne prázdno Draw ();
Circle (int atx, int ,ty, int theRadius);
inline virtual ~ Circle ();
Virtuálne prázdno Draw ();
Triedu Circle považujte za triedu Point s extra členom (polomerom). Zdedí základné členské funkcie a súkromné premenné X a y.
Nemôže ich priradiť alebo použiť, okrem nepriamych dôvodov, pretože sú súkromné, takže to musí urobiť prostredníctvom zoznamu Iniciátora konštruktora kruhu. To je niečo, čo by ste mali akceptovať tak ako doteraz. V budúcich tutoriáloch sa vrátim k zoznamom inicializátorov.
V Circle Constructor, predtým theRadius je priradený k polomer, bodová časť kruhu je vytvorená volaním konštruktora bodu v zozname inicializátorov. Tento zoznam predstavuje všetko medzi: a {nižšie.
Circle:: Circle (int atx, int aty, int theRadius): Bod (atx, aty)
Inicializácia typu konštruktora sa môže použiť pre všetky vstavané typy.
int al (10);
int a2 = 10;
Obaja robia to isté.
07
z 09
Čo je to polymorfizmus?
Polymorfizmus je všeobecný pojem, ktorý znamená „veľa tvarov“. V C ++ je najjednoduchšou formou polymorfizmu preťaženie funkcií. Napríklad sa volá niekoľko funkcií SortArray (typ poľa) kde by mohlo byť triedenie rad ints alebo štvorhra.
Zaujíma nás však iba forma polymorfizmu OOP. To sa dosiahne vytvorením funkcie (napr. Draw ()) virtuálne v základnej triede Point a potom ju prekonať v odvodená trieda Circle.
Aj keď je to funkcia Draw () je virtuálna v odvodenej triede kružnice, to v skutočnosti nie je potrebné - je to iba pripomenutie, že je to virtuálne. Ak funkcia v odvodenej triede zodpovedá virtuálnej funkcii v základnej triede podľa mena a typu parametra, je automaticky virtuálna.
Kreslenie bodu a kreslenie kruhu sú dve veľmi odlišné operácie, ktoré majú spoločné iba súradnice bodu a kruhu, takže je dôležité, aby správne Draw () sa volá. Ako sa kompilátorovi podarí vygenerovať kód, ktorý získa správnu virtuálnu funkciu, sa bude venovať budúca príručka.
08
z 09
Konštruktory C ++
konštruktéri
Konštruktor je funkcia, ktorá inicializuje členov objektu. Konštruktor vie len to, ako postaviť objekt svojej vlastnej triedy.
Konštruktory nie sú automaticky zdedené medzi základnou a odvodenou triedou. Ak jednu z odvodených tried neposkytnete, bude k dispozícii predvolená hodnota, ale nemusí to robiť to, čo chcete.
Ak nie je dodaný žiadny konštruktor, kompilátor vytvorí predvolený bez akýchkoľvek parametrov. Vždy musí existovať konštruktor, aj keď je predvolený a prázdny. Ak dodávate konštruktor s parametrami, predvolená hodnota NEBUDE vytvorená.
Niektoré body o konštruktoroch:
- Konštruktori sú iba funkcie s rovnakým názvom ako trieda.
- Konštruktori majú inicializovať členov triedy, keď sa vytvorí inštancia tejto triedy.
- Konštruktory sa nezvolávajú priamo (okrem zoznamov inicializátorov)
- Konštruktori nikdy nie sú virtuálni.
- Je možné definovať viac konštruktorov pre tú istú triedu. Na ich rozlíšenie musia mať rôzne parametre.
O konštruktoroch sa dozvieme oveľa viac, napríklad o predvolených konštruktoroch, priradeniach a kopírovacích konštruktoroch. Tieto budú prediskutované v nasledujúcej lekcii.
09
z 09
Upratovanie C ++ Destruktorov
Deštruktor je členská funkcia triedy, ktorá má rovnaké meno ako konštruktor (a trieda), ale s ~ (vlnovkou) pred.
~ Kruh ();
Ak je objekt mimo rozsahu alebo zriedkavejšie je explicitne zničený, je volaný jeho deštruktor. Napríklad, ak má objekt dynamické premenné, napríklad ukazovatele, je potrebné ich uvoľniť a deštruktor je vhodným miestom.
Na rozdiel od konštruktorov sa deštruktory môžu a mali by sa stať virtuálnymi, ak ste odvodili triedy. V bod a kružnice Napríklad triedy, deštruktor nie je potrebný, pretože nie je potrebné vykonať žiadne čistenie (slúži iba ako príklad). Keby existovali dynamické členské premenné (napr ukazovátka), potom by títo vyžadovali uvoľnenie, aby sa zabránilo úniku pamäte.
Keď odvodená trieda pridá členov, ktorí vyžadujú upratanie, sú potrebné virtuálne deštruktory. Ak je virtuálny, najskôr sa nazýva najrozšírenejší deštruktor triedy, potom sa volá jeho bezprostredný deštruktor, a tak ďalej až po základnú triedu.
V našom príklade
~ Kruh ();
potom
~ Bod ();
Deštruktor základných tried sa nazýva posledný.
Táto lekcia je dokončená. V nasledujúcej lekcii sa dozviete viac o predvolených konštruktoroch, kopírovacích konštruktoroch a úlohách.