Úvod do tříd a objektů C ++

click fraud protection

01

z 09

Spuštění tříd C ++

Ruce, psaní na notebooku
Sam Edwards / Getty Images

Objekty jsou největší rozdíl mezi C ++ a C. Jeden z nejčasnějších jmen pro C + + byl C s třídami.

Třídy a objekty

Třída je definice objektu. Je to typ jako int. Třída se podobá a struktur s jediným rozdílem: ve výchozím nastavení jsou všichni členové struktury veřejní. Všichni členové tříd jsou soukromé.

Pamatujte - třída je typ a objekt této třídy je jen proměnná.

Než budeme moci objekt použít, musí být vytvořen. Nejjednodušší definice třídy je:

 jméno třídy {

 // členy

 }


Tato ukázková třída níže modeluje jednoduchou knihu. Použití OOP vám umožní abstraktní problém a přemýšlet o něm, a to nejen libovolné proměnné.

 // příklad jedna

 #zahrnout 

 #zahrnout 


 třídní kniha

 {

 int PageCount;

 int CurrentPage; 

 veřejnost:

 Kniha (int Numpages); // Konstruktor

 ~ Kniha () {}; // Destruktor

 void SetPage (int PageNumber);

 int GetCurrentPage (neplatné);

 }; 


 Kniha:: Kniha (int NumPages) {

 PageCount = NumPages;

 }


 void Book:: SetPage (int PageNumber) {

 CurrentPage = PageNumber;
instagram viewer

 }


 int Book:: GetCurrentPage (neplatné) {

 return CurrentPage;

 }


 int main () {

 Kniha ABook (128);

 Kniha. SetPage (56);

 std:: cout << "Aktuální stránka" << ABook. GetCurrentPage () << std:: endl;

 návrat 0;

 }


Celý kód z třídní kniha dolů na int Book:: GetCurrentPage (neplatné) { funkce je součástí třídy. hlavní() Tato funkce slouží k tomu, aby byla tato aplikace spustitelná.

02

z 09

Porozumění třídě knih

V hlavní() funkce je vytvořena proměnná ABook typu Book s hodnotou 128. Jakmile provedení dosáhne tohoto bodu, je zkonstruován objekt ABook. Na dalším řádku je metoda Kniha. SetPage () je volána a hodnota 56 je přiřazena k proměnné objektu Kniha. CurrentPage. Pak cout výstupy této hodnoty voláním Kniha. GetCurrentPage () metoda.

Když provedení dosáhne návrat 0; objekt ABook již aplikace nepotřebuje. Kompilátor generuje volání destruktoru.

Deklarování tříd

Všechno mezi Třídní kniha a } je deklarace třídy. Tato třída má dva soukromé členy, oba typu int. Toto je soukromé, protože výchozí přístup k členům třídy je soukromý.

veřejnost: směrnice říká překladač že přístup odtud je veřejný. Bez tohoto by to bylo stále soukromé a zabránilo by tomu, aby tři řádky v hlavní funkci () přistupovaly k členům Abook. Zkuste komentovat veřejnost: line out a recompiling vidět následující kompilace chyby.

Tento řádek níže prohlašuje konstruktora. Toto je funkce, která se nazývá při prvním vytvoření objektu.

 Kniha (int Numpages); // Konstruktor 

Volá se z linky

 Kniha ABook (128); 

Tím se vytvoří objekt nazvaný ABook typu Book a zavolá funkci Book () pomocí parametr 128.

03

z 09

Více o třídě knih

V C ++ má konstruktor vždy stejný název jako třída. Konstruktor je volán, když je objekt vytvořen a je to místo, kam byste měli vložit kód pro inicializaci objektu.

V knize Další řádek za konstruktorem destruktor. Toto má stejné jméno jako konstruktor, ale před ním je ~ (vlnovka). Během zničení objektu se vyvolá destruktor, aby objekt uklidil a zajistil uvolnění prostředků, jako je paměť a popisovač souboru, které daný objekt používá.

Zapamatovat si—A třída xyz má konstruktorovou funkci xyz () a destruktorovou funkci ~ xyz (). I když to nevyhlásíte, kompilátor je tiše přidá.

Destruktor se vždy volá, když je objekt ukončen. V tomto příkladu je objekt implicitně zničen, když vyjde z rozsahu. Chcete-li to vidět, upravte prohlášení destruktoru takto:

 ~ Book () {std:: cout << "Destructor nazvaný";}; // Destruktor 

Toto je inline funkce s kódem v deklaraci. Dalším způsobem inline je přidání slova inline

 inline ~ Book (); // Destruktor


a přidat destruktor jako funkci jako je tato.

 inline Book:: ~ Book (void) { 

 std:: cout << "Destructor nazývá";

 }


Inline funkce jsou rady pro kompilátor pro generování efektivnějšího kódu. Měly by být použity pouze pro malé funkce, ale pokud jsou používány na vhodných místech - například uvnitř smyčky- může výrazně změnit výkon.

04

z 09

Metody psaní tříd

Nejlepší praxe pro objekty je učinit všechna data soukromými a přistupovat k nim prostřednictvím funkcí známých jako funkce přístupu. SetPage () a GetCurrentPage () jsou dvě funkce používané pro přístup k proměnné objektu CurrentPage.

Změň třída deklarace strukturovat a překompilovat. Stále by se měl kompilovat a správně spustit. Nyní dvě proměnné PageCount a CurrentPage jsou veřejně přístupné. Přidejte tento řádek za Book ABook (128) a zkompiluje se.

 Kniha. PageCount = 9;


Pokud změníte strukturu zpět na třída a zkompilujte, že nový řádek již nebude kompilován jako PageCount je nyní opět soukromý.

The:: Notation

Po těle deklarace třídy knihy existují čtyři definice členských funkcí. Každá je definována s předponou Book::, aby ji identifikovala jako náležející do této třídy.:: se nazývá identifikátor oboru. Identifikuje funkci jako součást třídy. To je zřejmé v deklaraci třídy, ale ne mimo ni.

Pokud jste ve třídě deklarovali funkci člena, musíte tímto způsobem poskytnout tělo funkce. Pokud chcete, aby třída Book byla použita jinými soubory, můžete přesunout deklaraci knihy do samostatné záhlaví soubor, snad nazvaný book.h. Jakýkoli jiný soubor by jej pak mohl zahrnout do

 #include "book.h" 

05

z 09

Dědičnost a polymorfismus

Tento příklad bude demonstrovat dědičnost. Jedná se o dvou třídovou aplikaci s jednou třídou odvozenou od jiné.

 #zahrnout 

 #zahrnout 


 třída Point

 {


 int x, y;

 veřejnost:

 Bod (int atx, int aty); // Konstruktor

 vložený virtuální ~ Point (); // Destruktor

 virtuální prázdnotka Draw ();

 }; 


 třída Circle: public Point {


 vnitřní poloměr;

 veřejnost:

 Circle (int atx, int aty, int theRadius);

 inline virtual ~ Circle ();

 virtuální prázdnotka 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): Point (atx, aty) {

 radius = theRadius;

 }


 inline Circle:: ~ Circle () {

 std:: cout << "Circle Destructor s názvem" << std:: endl;

 }


 void Circle:: Draw (void) {

 Point:: Draw ();

 std:: cout << "circle:: Draw point" << "Radius" << radius << std:: endl;

 }


 int main () {

 Circle ACircle (10,10,5);

 Kruh. Kreslit() ;

 návrat 0;

 }


Příklad má dvě třídy, Bod a Kruh, modelování bodu a kružnice. Bod má souřadnice xay. Třída Circle je odvozena od třídy Point a přidává poloměr. Obě třídy zahrnují a Kreslit() funkce člena. Aby byl tento příklad krátký, výstupem je pouze text.

06

z 09

Dědictví

Třída Kruh je odvozen z Směřovat třída. To se provádí v tomto řádku:

 třída Circle: Point {


Protože je odvozen od základní třídy (Point), Circle zdědí všechny členy třídy.

 Bod (int atx, int aty); // Konstruktor

 vložený virtuální ~ Point (); // Destruktor

 virtuální prázdnotka Draw ();


 Circle (int atx, int aty, int theRadius);

 inline virtual ~ Circle ();

 virtuální prázdnotka Draw ();


Třídu Circle považujte za třídu Point s extra členem (poloměr). Zdědí základní členské funkce a soukromé proměnné X a y.

Nemůže je přiřadit nebo použít, vyjma implicitně, protože jsou soukromé, takže to musí udělat prostřednictvím seznamu Initializer konstruktoru Circle. To je něco, co byste měli přijmout tak, jak je prozatím. V příštím tutoriálu se vrátím k seznamům inicializátorů.

V Circle Constructor, předtím theRadius je přiřazen k poloměr, Bodová část kruhu je konstruována voláním konstruktoru bodu v seznamu inicializátorů. Tento seznam je vše mezi: a {níže.

 Circle:: Circle (int atx, int aty, int theRadius): Point (atx, aty) 


Inicializace typu konstruktoru lze mimo jiné použít pro všechny vestavěné typy.

 int al (10);

 int a2 = 10;


Oba dělají totéž.

07

z 09

Co je polymorfismus?

Polymorfismus je obecný pojem, který znamená „mnoho tvarů“. V C ++ je nejjednodušší formou polymorfismu přetížení funkcí. Například se nazývá několik funkcí SortArray (typ pole) kde by mohlo být třídění pole ints nebo čtyřhra.

Zajímá nás však pouze forma polymorfismu OOP. To se provádí vytvořením funkce (např. Draw ()) virtuální v základní třídě Point a poté jej přepíšeme v odvozená třída Kruh.

I když funkce Kreslit() je virtuální ve odvozené třídě Kruh, to ve skutečnosti není potřeba - je to jen připomínka, že je to virtuální. Pokud funkce ve odvozené třídě odpovídá virtuální funkci v základní třídě podle typu jména a typu, je automaticky virtuální.

Kreslení bodu a nakreslení kruhu jsou dvě velmi odlišné operace, které mají společné pouze souřadnice bodu a kružnice, takže je důležité, Kreslit() je nazýván. Jak kompilátor dokáže vygenerovat kód, který získá správnou virtuální funkci, se bude zabývat budoucí výuka.

08

z 09

Konstruktory C ++

Konstruktory

Konstruktor je funkce, která inicializuje členy objektu. Konstruktor ví jen, jak postavit objekt své vlastní třídy.

Konstruktory nejsou automaticky zděděni mezi základní a odvozenou třídou. Pokud jednu z odvozených tříd nedodáte, bude poskytnuta výchozí hodnota, ale nemusí to dělat to, co chcete.

Není-li dodán žádný konstruktor, kompilátor vytvoří výchozí stav bez jakýchkoli parametrů. Vždy musí existovat konstruktor, i když je výchozí a prázdný. Pokud konstruktoru dodáte parametry, nebude výchozí hodnota vytvořena.

Několik bodů o konstruktérech:

  • Konstruktory jsou jen funkce se stejným názvem jako třída.
  • Konstruktory mají inicializovat členy třídy, když je vytvořena instance této třídy.
  • Konstruktory nejsou voláni přímo (kromě seznamů inicializátorů)
  • Konstruktory nejsou nikdy virtuální.
  • Lze definovat více konstruktorů pro stejnou třídu. Musí mít různé parametry, aby je bylo možné odlišit.

O konstruktorech se toho dozví mnohem více, například o výchozích konstruktorech, přiřazeních a kopírování konstruktérů. Budou diskutovány v následující lekci.

09

z 09

Uklízení C ++ Destruktorů

Destruktor je funkce člena třídy, která má stejný název jako konstruktor (a třída), ale s ~ (vlnovkou) vpředu.

 ~ Circle ();


Když objekt zmizí nebo je zřídka explicitně zničen, je vyvolán jeho destruktor. Například, pokud má objekt dynamické proměnné, jako jsou ukazatele, je třeba je uvolnit a destruktor je vhodným místem.

Na rozdíl od konstruktorů mohou být destruktory a měly by být virtuální, pokud máte odvozené třídy. V Směřovat a Kruh Příklad tříd, destruktor není nutný, protože není třeba provádět žádné vyčištění (pouze slouží jako příklad). Kdyby existovaly dynamické členské proměnné (jako ukazatele), pak by tito vyžadovali uvolnění, aby se zabránilo úniku paměti.

Také, když odvozená třída přidá členy, které vyžadují úklid, jsou nutné virtuální destruktory. Když je virtuální, první odvozený destruktor třídy se nazývá první, potom se nazývá jeho bezprostřední destruktor, a tak dále až do základní třídy.

V našem příkladu

 ~ Circle ();

pak

 ~ Point ();


Destruktor základních tříd se nazývá poslední.

Tím je tato lekce dokončena. V následující lekci se dozvíte o výchozích konstruktérech, kopírovacích konstruktorech a přiřazení.

instagram story viewer