01
z dne 09
Začetek C ++ razredov

Predmeti so največja razlika med C ++ in C. Eno najzgodnejših imen za C ++ je bilo C z razredi.
Razredi in predmeti
Razred je definicija predmeta. To je tak tip int. Razred spominja na a Stru samo z eno razliko: vsi člani struktur so privzeto javni. Vsi člani razredov so zasebni.
Ne pozabite - razred je vrsta in predmet tega razreda je samo a spremenljivka.
Preden lahko uporabimo predmet, ga moramo izdelati. Najenostavnejša definicija razreda je:
ime razreda {
// člani
}
Ta primer spodaj predstavlja preprosto knjigo. Z uporabo OOP-a lahko abstraktite težavo in razmišljate o njej in ne le o poljubnih spremenljivkah.
// primer ena
#include
#include
razred Knjiga
{
int PageCount;
int CurrentPage;
javno:
Knjiga (int Numpages); // Konstruktor
~ Knjiga () {}; // Destruktor
nična SetPage (int PageNumber);
int GetCurrentPage (nično);
};
Knjiga:: Knjiga (int NumPages) {
PageCount = NumPages;
}
void Book:: SetPage (int PageNumber) {
CurrentPage = Število strani;
}
int Book:: GetCurrentPage (void) {
vrne CurrentPage;
}
int main () {
Knjiga ABook (128);
Knjiga. SetPage (56);
std:: cout << "Trenutna stran" << Oglejte si. GetCurrentPage () << std:: endl;
vrne 0;
}
Vsa koda od učilnica navzdol do int Book:: GetCurrentPage (void) { funkcija je del razreda. The glavni () Funkcija je na voljo za to, da to naredite za uporabo.
02
z dne 09
Razumevanje knjižnega razreda
V glavni () delujejo spremenljivka ABook vrste Book je ustvarjena z vrednostjo 128. Takoj, ko izvedba doseže to točko, se konstruira objekt ABook. V naslednji vrstici metoda Knjiga. SetPage () se pokliče in vrednost 56 je dodeljena objektni spremenljivki Knjiga. Trenutna stran. Potem cout odda to vrednost s klicem Knjiga. GetCurrentPage () metoda.
Ko izvršba doseže vrne 0; objekta ABook aplikacija ne potrebuje več. Prevajalnik ustvari klic destruktorju.
Razglasitev razredov
Vse med Razredna knjiga in } je deklaracija razreda. V tem razredu sta dva zasebna člana, oba tipa int. Te so zasebne, ker je privzeti dostop do članov razreda zaseben.
The javno: direktiva pove prevajalnik da so od tu naprej dostopi javni. Brez tega bi bil še vedno zaseben in bi preprečeval dostop do treh vrstic v glavni () funkciji. Poskusite komentirati javno: izločite in ponovno sestavite, če želite videti napake pri prevajanju.
V spodnji vrstici je razviden Konstruktor. To je funkcija, ki se imenuje ob prvem ustvarjanju predmeta.
Knjiga (int Numpages); // Konstruktor
Kliče se iz vrstice
Knjiga ABook (128);
To ustvari predmet, imenovan ABook vrste Book, in pokliče funkcijo Book () s parameter 128.
03
z dne 09
Več o knjižnem razredu
V C ++ ima konstruktor vedno isto ime kot razred. Konstruktor se pokliče, ko je predmet ustvarjen, in tam, kjer morate vnesti kodo, da objekt inicializirate.
V knjigi Naslednja vrstica po konstruktorju destruktor. To ima isto ime kot konstruktor, vendar s ~ (tildo) pred njim. Med uničenjem predmeta pokliče destruktor, da pospravi predmet in zagotovi, da se sprostijo viri, kot so pomnilnik in datoteke, ki jih predmet uporablja.
Ne pozabite—Razred xyz ima funkcijo konstruktorja xyz () in funkcijo destruktorja ~ xyz (). Tudi če ne deklarirate, jih bo prevajalnik tiho dodal.
Destruktor se vedno pokliče, ko objekt preneha. V tem primeru je objekt implicitno uničen, ko gre zunaj obsega. Če želite to videti, spremenite izjavo destruktorja na to:
~ Book () {std:: cout << "Destruktor se imenuje";}; // Destruktor
To je vgrajena funkcija s kodo v deklaraciji. Drug način za vstavljanje je dodajanje besede inline
inline ~ Rezerviraj (); // Destruktor
in dodajte destruktor kot takšno funkcijo.
inline knjiga:: ~ knjiga (nična) {
std:: cout << "Destruktor klican";
}
Vgrajene funkcije so namigi prevajalniku, da ustvari učinkovitejšo kodo. Uporabljajte jih lahko le za majhne funkcije, če pa jih uporabljate na primernih mestih - na primer znotraj zanke—Si lahko bistveno spremenijo zmogljivost.
04
z dne 09
Metode poučevanja pri pisanju
Najboljša vaja Za predmete je treba vse podatke narediti zasebne in do njih dostopati s funkcijami, znanimi kot funkcije dostopa. SetPage () in GetCurrentPage () sta dve funkciji, ki se uporabljata za dostop do spremenljivke predmeta Trenutna stran.
Spremenite razred izjavo za strukturiranje in prevajanje. Še vedno bi se moral pravilno sestaviti in zagnati. Zdaj dve spremenljivki PageCount in Trenutna stran so javno dostopni. Za vrstico Book ABook (128) dodajte to vrstico in sestavljena bo.
Knjiga. PageCount = 9;
Če spremenite strukturo nazaj v razred in ponovno prevedite, da nova vrstica ne bo več sestavljena kot PageCount je zdaj spet zasebno.
:: Notacija
Po vsebini deklaracije Book Class so na voljo štiri definicije funkcij članov. Vsak je opredeljen s predpono Book::, da ga prepozna, da pripada temu razredu.:: se imenuje identifikator obsega. Funkcijo prepozna kot del razreda. To je očitno v deklaraciji razreda, ne pa tudi zunaj nje.
Če ste funkcijo člana razglasili v razredu, morate na ta način priskrbeti telo funkcije. Če želite, da razred Book uporabljajo druge datoteke, lahko deklaracijo knjige premaknete v ločeno glava datoteka, ki se morda imenuje book.h. Vsaka druga datoteka bi jo lahko nato vključila
#include "book.h"
05
z dne 09
Dediščina in polimorfizem
Ta primer bo pokazal dednost. To je aplikacija dveh razredov, pri čemer en razred izhaja iz drugega.
#include
#include
razred Točka
{
int x, y;
javno:
Točka (int atx, int aty); // Konstruktor
inline virtual ~ točka (); // Destruktor
navidezna praznina Draw ();
};
razred krog: javna točka {
int polmer;
javno:
Krog (int atx, int aty, int theRadius);
vgrajen navidezni ~ krog ();
navidezna praznina Draw ();
};
Točka:: Točka (int atx, int aty) {
x = atx;
y = aty;
}
inline točka:: ~ točka (nična) {
std:: cout << "Klican Destruktor pozvan";
}
void Point:: Risanje (void) {
std:: cout << "Točka:: Narišite točko pri" << x << "" << y << std:: endl;
}
Circle: Circle (int atx, int aty, int theRadius): Točka (atx, aty) {
polmer = theRadius;
}
inline krog:: ~ Circle () {
std:: cout << "Destruktor kroga imenovan" << std:: endl;
}
void Circle:: Risanje (void) {
Točka:: Riši ();
std:: cout << "krog:: Narišite točko" << "Polmer" << polmer << std:: endl;
}
int main () {
Circle ACircle (10,10,5);
Kolobar. Risanje ();
vrne 0;
}
Primer ima dva razreda, točko in krog, ki modelirata točko in krog. Točka ima koordinate x in y. Razred Circle izhaja iz razreda Point in doda polmer. Oba razreda vključujeta: Risanje () članska funkcija. Da bi bil ta primer kratek, je izhod zgolj besedilo.
06
z dne 09
Dediščina
Razred Krog izhaja iz Točka razred. To se naredi v tej vrstici:
razred krog: Točka {
Ker izhaja iz osnovnega razreda (točka), krog podeduje vse člane razreda.
Točka (int atx, int aty); // Konstruktor
inline virtual ~ točka (); // Destruktor
navidezna praznina Draw ();
Krog (int atx, int aty, int theRadius);
vgrajen navidezni ~ krog ();
navidezna praznina Draw ();
Razmislite o razredu Circle kot razredu Point z dodatnim članom (polmerom). Deduje funkcije baznega razreda Member in zasebne spremenljivke x in y.
Teh ne more dodeliti ali uporabiti, razen implicitno, ker so zasebne, zato mora to storiti na seznamu pobudnikov konstruktorjev Circle. To bi morali sprejeti tako, kot je za zdaj. V prihodnji vadnici se bom vrnil na sezname inicializatorjev.
V Konstruktorju krogov, prej theRadius je dodeljeno polmer, točkovni del kroga je zgrajen s klicem točkovega konstruktorja na seznamu inicializatorja. Na tem seznamu je vse med: in {spodaj.
Circle: Circle (int atx, int aty, int theRadius): točka (atx, aty)
Mimogrede, inicializacija tipa konstruktorja se lahko uporablja za vse vgrajene tipe.
int a1 (10);
int a2 = 10;
Oba delata enako.
07
z dne 09
Kaj je polimorfizem?
Polimorfizem je generični izraz, ki pomeni "številne oblike". V C ++ je najpreprostejša oblika polimorfizma preobremenitev funkcij. Na primer, poklicanih je več funkcij SortArray (vrstni niz) tam, kjer bi lahko bila sorta matrika intov oz dvojice.
Tu nas zanima le oblika polimorfizma OOP. To se naredi s funkcijo (npr. Nariši ()) navidezno v osnovnem razredu Point in ga nato preglasi v izpeljani razred Krog.
Čeprav funkcija Risanje () je virtualni v izpeljanem razredu Krog, to dejansko ni potrebno - samo opomnik me je, da je to virtualno. Če se funkcija v izpeljanem razredu ujema z navidezno funkcijo v osnovnem razredu glede na ime in vrste parametrov, je samodejno navidezna.
Risba točke in risanje kroga sta dve zelo različni operaciji, ki imata skupno le koordinate točke in kroga, zato je pomembno, da pravilno Risanje () je poklican. Kako bo prevajalnik ustvaril kodo, ki dobi pravo virtualno funkcijo, bo predstavljeno v prihodnji vadnici.
08
z dne 09
Konstruktorji C ++
Konstruktorji
Konstruktor je funkcija, ki inicializira člane predmeta. Konstruktor zna samo sestaviti predmet svojega razreda.
Konstruktorji se ne podedujejo samodejno med osnovnimi in izvedenimi razredi. Če ga ne dobite v izpeljanem razredu, bo na voljo privzeti, vendar to ne bo storilo, kar želite.
Če ni dobavljen noben konstruktor, potem prevajalnik ustvari privzeto različico brez parametrov. Vedno mora biti konstruktor, tudi če je privzet in prazen. Če konstruktorju dobavljate parametre, privzeto NE bo ustvarjeno.
Nekaj točk o konstruktorjih:
- Konstruktorji so samo funkcije z istim imenom kot razred.
- Konstruktorji so namenjeni inicializaciji članov razreda, ko se ustvari primerek tega razreda.
- Konstruktorji se ne kličejo neposredno (razen prek seznamov inicializatorjev)
- Konstruktorji nikoli niso virtualni.
- Opredelimo lahko več konstruktorjev za isti razred. Za razlikovanje morajo imeti različne parametre.
Veliko več se lahko nauči o konstruktorjih, na primer privzetih konstruktorjih, konstruktorjih za dodeljevanje in kopiranje. O teh bomo govorili v naslednji lekciji.
09
z dne 09
Odpravljanje C ++ uničevalcev
Destruktor je funkcija člana razreda, ki ima isto ime kot konstruktor (in razred), vendar ima ~ (tilde) spredaj.
~ Krog ();
Ko gre predmet zunaj obsega ali je redkeje izrecno uničen, se pokliče njegov uničevalec. Na primer, če ima objekt dinamične spremenljivke, kot so kazalci, jih je treba sprostiti in destruktor je primerno mesto.
Za razliko od konstruktorjev lahko destruktorji postanejo virtualni, če imate izpeljane razrede. V Točka in Krog Primer razredov, destruktor ni potreben, saj čiščenja ni treba opraviti (služi samo kot primer). Ali so bile spremenljive dinamične članske spremenljivke (npr kazalci), potem bi ti zahtevali sprostitev, da preprečijo uhajanje spomina.
Ko dobljeni razred doda člane, ki potrebujejo urejanje, so potrebni navidezni destruktorji. Ko je virtualni, se najprej pokliče uničevalec najbolj izpeljanega razreda, nato se pokliče uničevalec njegovega neposrednega prednika itd. Do osnovnega razreda.
V našem primeru je dr.
~ Krog ();
torej
~ Točka ();
Destruktor osnovnih razredov se imenuje zadnji.
S tem zaključimo to lekcijo. V naslednji lekciji spoznajte privzete konstruktorje, konstruktorje kopiranja in naloge.