01
od 09
Pokretanje C ++ klase

objekti su najveća razlika između C ++ i C. Jedno od najranijih imena za C ++ bilo je C s klasama.
Klase i predmeti
Klasa je definicija objekta. To je tip baš takav int. Razred nalikuje a struct sa samo jednom razlikom: svi su članovi strukture zadano javni. Svi članovi klase su privatni.
Zapamtite - klasa je vrsta, a predmet te klase samo je varijabla.
Prije nego što možemo koristiti objekt, on se mora stvoriti. Najjednostavnija definicija klase je:
naziv klase {
// članovi
}
Ovaj primjer razreda ispod modelira jednostavnu knjigu. Korištenjem OOP-a omogućuje vam apstrahiranje problema i razmišljanje o njemu, a ne samo o proizvoljnim varijablama.
// primjer jedan
#include
#include
razredna knjiga
{
int PageCount;
int CurrentPage;
javnost:
Knjiga (int Numpages); // Konstruktor
-Book () {}; // Destruktor
void SetPage (int PageNumber);
int GetCurrentPage (void);
};
Knjiga:: Knjiga (int NumPages) {
PageCount = NumPages;
}
void Book:: SetPage (int PageNumber) {
CurrentPage = PAGENUMBER;
}
int knjiga:: GetCurrentPage (void) {
vratiti CurrentPage;
}
int main () {
Knjiga ABook (128);
Knjiga. SetPage (56);
std:: cout << "Trenutna stranica" << Pogledajte. GetCurrentPage () << std:: endl;
vratiti 0;
}
Sav kod iz razredna knjiga dolje na int knjiga:: GetCurrentPage (void) { funkcija je dio klase. glavni() postoji funkcija da se to napravi aplikacija za pokretanje.
02
od 09
Razumijevanje klase knjige
U glavni() funkcionira varijabla ABook tipa Book stvara se sa vrijednosti 128. Čim izvršenje dosegne ovu točku, konstruira se objekt ABook. U sljedećem retku metoda Knjiga. SetPage () naziva se i vrijednost 56 dodjeljuje objektnoj varijabli Knjiga. Trenutna stranica. Zatim cout izvodi ovu vrijednost pozivom Knjiga. GetCurrentPage () metoda.
Kad izvršenje dosegne vratiti 0; objekt ABook više nije potreban aplikaciji. Kompajler generira poziv destruktoru.
Izjava klase
Sve između Knjiga o razredima i the } je klasa deklaracija. Ova klasa ima dva privatna člana, oba tipa int. Oni su privatni jer je zadani pristup članovima klase privatan.
javnost: direktiva govori kompajler da je pristup odavde javni. Bez toga, i dalje bi bilo privatno i spriječilo pristup trima linijama u glavnoj () funkciji članovima Abook-a. Pokušajte komentirati javnost: izdvojite liniju i ponovno sastavljanje da biste vidjeli proizlazeće pogreške u sastavljanju.
Ovaj redak u nastavku izjavljuje Konstruktora. Ovo je funkcija koja se zove kada se prvi put stvori objekt.
Knjiga (int Numpages); // Konstruktor
Zove se iz linije
Knjiga ABook (128);
Ovo stvara objekt nazvan ABook vrste Book i poziva Book () funkciju s parametar 128.
03
od 09
Više o klasi knjige
U C ++, konstruktor uvijek ima isti naziv kao i klasa. Konstruktor se poziva kada se objekt kreira i tamo gdje trebate staviti svoj kod da biste ga inicijalizirali.
U knjizi Sljedeći redak nakon konstruktora destruktor. To ima isti naziv kao konstruktor, ali s ~ (tildom) ispred njega. Tijekom uništavanja objekta, destruktor se poziva posložiti objekt i osigurati da se oslobode resursa poput memorije i rukovanja datotekama koje objekt koristi.
Zapamtiti- klasa xyz ima funkciju konstruktora xyz () i funkciju destruktora ~ xyz (). Čak i ako se ne izjasnite, prevoditelj će ih tiho dodati.
Destruktor se uvijek naziva kada se objekt završi. U ovom primjeru objekt se implicitno uništava kad izađe iz okvira. Da biste to vidjeli, izmijenite deklaraciju destruktora na ovo:
~ Book () {std:: cout << "Destruktor pozvan";}; // Destruktor
Ovo je inline funkcija s kodom u deklaraciji. Još jedan način inline je dodavanje riječi inline
inline ~ Book (); // Destruktor
i dodajte destruktor kao funkciju poput ove.
inline knjiga:: ~ Knjiga (praznina) {
std:: cout << "Destruktor pozvan";
}
Inline funkcije su savjeti za prevoditelj kako bi se generirao učinkovitiji kod. Koriste se samo za male funkcije, ali ako se upotrebljavaju na odgovarajućim mjestima - poput unutra petlje—Su mogu značajno utjecati na performanse.
04
od 09
Metode nastave pisanja
Najbolja vježba za objekte je učiniti da svi podaci budu privatni i da im se pristupi kroz funkcije poznate kao funkcije pristupa. SetPage () i GetCurrentPage () su dvije funkcije koje se koriste za pristup objektnoj varijabli Trenutna stranica.
Promijeni klasa deklaracija za strukturiranje i prekomponovanje. Trebao bi se ispravno sastaviti i pokrenuti. Sada dvije varijable PAGECOUNT i Trenutna stranica su javno dostupni. Dodajte ovu liniju nakon knjige ABook (128), i ona će se sastaviti.
Knjiga. PageCount = 9;
Ako promijenite strukturu natrag u klasa i prekomponirati, taj se novi redak više neće kompilirati kao PAGECOUNT sada je opet privatna.
:: Napomena
Nakon tijela Deklaracije klase knjiga, slijede četiri definicije funkcija članova. Svaki je definiran prefiksom Book:: da bi ga identificirao kao pripadnik toj klasi.:: zove se identifikator obuhvata. On identificira funkciju kao dio klase. To je očito u deklaraciji klase, ali ne i izvan nje.
Ako ste funkciju člana proglasili u klasi, na taj način morate pružiti tijelo funkcije. Ako želite da klasa Book koristi druge datoteke, tada možete deklaraciju knjige premjestiti u zasebnu Zaglavlje spis, možda nazvan book.h. Bilo koja druga datoteka tada bi ga mogla uključiti
#include "book.h"
05
od 09
Nasljeđivanje i polimorfizam
Ovaj će primjer pokazati nasljedstvo. Ovo je aplikacija za dvije klase, a jedna klasa je izvedena iz druge.
#include
#include
klasa Point
{
int x, y;
javnost:
Točka (int atx, int aty); // Konstruktor
inline virtual ~ ~ Point (); // Destruktor
virtualna void Draw ();
};
klasa Krug: javna točka {
int polumjer;
javnost:
Krug (int atx, int aty, int theRadius);
inline virtualni ~ krug ();
virtualna void Draw ();
};
Točka:: Točka (int atx, int aty) {
x = atx;
y = aty;
}
inline točka:: ~ točka (praznina) {
std:: cout << "Destruktor točka zove";
}
praznina Točka:: Crtanje (praznina) {
std:: cout << "Točka:: Crtanje točke na" << x << "" << y << std:: endl;
}
Circle:: Circle (int atx, int aty, int theRadius): točka (atx, aty) {
polumjer = theRadius;
}
redni krug:: ~ Circle () {
std:: cout << "Destruktor kruga nazvan" << std:: endl;
}
void krug:: Crtanje (praznina) {
Točka:: Crtanje ();
std:: cout << "krug:: Crtanje točke" << "Radijus" << radijus << std:: endl;
}
int main () {
Kružni krug (10,10,5);
Krug. Crtati() ;
vratiti 0;
}
Primjer ima dvije klase, Točku i Krug, koji modeliraju točku i krug. Točka ima x i y koordinate. Klasa Circle izvedena je iz klase Point i dodaje polumjer. Oba razreda uključuju: Crtati() funkcija člana. Da bi ovaj primjer bio kratak, izlaz je samo tekst.
06
od 09
baština
Razred Krug je izvedeno iz Točka klase. To je učinjeno u ovom retku:
Krug klase: Točka {
Budući da je izveden iz osnovne klase (Point), Circle nasljeđuje sve članove klase.
Točka (int atx, int aty); // Konstruktor
inline virtual ~ ~ Point (); // Destruktor
virtualna void Draw ();
Krug (int atx, int aty, int theRadius);
inline virtualni ~ krug ();
virtualna void Draw ();
Zamislite klasu Circle kao klasu Point s dodatnim članom (polumjerom). Nasljeđuje funkcije člana osnovne baze i privatne varijable x i y.
Ne može ih dodijeliti ili koristiti, osim implicitno, jer su privatni, pa to mora učiniti putem popisa inicijatora kruga konstruktora. To je nešto što biste trebali prihvatiti kao i do sada. Vratit ću se popisima inicijalizatora u budućem udžbeniku.
U Konstruktor kruga, prije theRadius dodijeljen je radius, točkaški dio kruga izgrađen je pozivom na Point konstruktor na popisu inicijalizatora. Ovaj je popis sve između: i {ispod.
Circle: Circle (int atx, int aty, int theRadius): točka (atx, aty)
Usput, inicijalizacija tipa konstruktora može se koristiti za sve ugrađene tipove.
int a1 (10);
int a2 = 10;
Oboje čine isto.
07
od 09
Što je polimorfizam?
Polimorfizam je generički izraz koji znači "mnogo oblika". U C ++ najjednostavniji oblik polimorfizma je preopterećenje funkcija. Na primjer, nekoliko funkcija koje se zovu SortArray (niz polja) gdje bi sortar mogao biti an red inta ili dubl.
Ipak nas zanima samo oblik OOP polimorfizma. To se postiže izradom funkcije (npr. Crtanje ()) virtualan u osnovnoj klasi Point i zatim nadjačavajući je u izvedena klasa Krug.
Iako je funkcija Crtati() je virtualna u izvedenoj klasi Krug, ovo zapravo nije potrebno - samo mi je podsjetnik da je to virtualno. Ako funkcija u izvedenom razredu odgovara virtualnoj funkciji u osnovnoj klasi u imenu i parametrima, automatski je virtualna.
Crtanje točke i crtanje kruga dvije su vrlo različite operacije sa samo zajedničkim koordinatama točke i kruga, tako da je važno da ispravna Crtati() Zove se. Kako kompajler uspije generirati kôd koji dobiva pravu virtualnu funkciju bit će prikazan u budućem vodiču.
08
od 09
C ++ Konstruktori
graditelji
Konstruktor je funkcija koja inicijalizira članove objekta. Konstruktor zna samo izgraditi objekt svoje klase.
Konstruktori se ne nasljeđuju automatski između osnovne i izvedene klase. Ako ga ne navedete u izvedenoj klasi, bit će vam zadana zadana postavka, ali to možda neće raditi ono što želite.
Ako nije isporučen nijedan konstruktor, tada prevoditelj stvara zadani oblik bez ikakvih parametara. Uvijek mora postojati konstruktor, čak i ako je zadani i prazan. Ako dobavljate konstruktoru parametre, zadana vrijednost NE će se stvoriti.
Neke točke o konstruktorima:
- Konstruktori su samo funkcije s istim nazivom kao i klasa.
- Konstruktori imaju namjeru inicijalizirati članove klase kada se stvori instanca te klase.
- Konstruktori se ne pozivaju izravno (osim putem popisa inicijalizatora)
- Konstruktori nikada nisu virtualni.
- Može se definirati više konstruktora za isti razred. Moraju imati različite parametre kako bi ih razlikovali.
Puno se više može naučiti o konstruktorima, na primjer, tvornicima zadanih konstrukcija, dodjeli i kopiranju konstruktora. O njima će se raspravljati u sljedećoj lekciji.
09
od 09
Uklanjanje destruktora C ++
Destruktor je funkcija člana klase koja ima isti naziv kao konstruktor (i klasa), ali s ~ (tilde) ispred.
~ Krug ();
Kad neki objekt izađe iz područja primjene ili rjeđe bude eksplicitno uništen, naziva se njegov destruktor. Na primjer, ako objekt ima dinamičke varijable poput pokazivača, tada ih treba osloboditi i destruktor je odgovarajuće mjesto.
Za razliku od konstruktora, destruktori mogu i trebaju biti virtualni ako imate izvedene klase. U Točka i Krug Primjerima klase, destruktor nije potreban jer ne treba raditi čišćenje (služi samo kao primjer). Da su postojale dinamičke varijable člana (poput upućuje) tada bi se njima zahtijevalo oslobađanje kako bi se spriječilo curenje memorije.
Također, kada izvedena klasa doda članove koji zahtijevaju popravak, potrebni su virtualni destruktori. Kada je virtualna, najprije se naziva destruktor najviše izvedene klase, zatim se naziva destruktor neposrednog pretka, i tako dalje, do osnovne klase.
U našem primjeru
~ Krug ();
zatim
~ Točka ();
Destruktor osnovne klase naziva se posljednjim.
Time se završava ova lekcija. U sljedećoj lekciji naučite o zadanim konstruktorima, konstruktorima kopiranja i zadatku.