Sissejuhatus C ++ klassidesse ja objektidesse

01

alates 09

C ++ klasside alustamine

Käed kirjutades sülearvutil
Sam Edwards / Getty Images

Objektid on suurim erinevus C ++ ja C vahel. C ++ üks varasemaid nimesid oli C klassidega.

Klassid ja objektid

Klass on objekti määratlus. See on tüüp just nagu int. Klass sarnaneb a struct ainult ühe erinevusega: kõik struktuuri liikmed on vaikimisi avalikud. Kõik klasside liikmed on eraviisilised.

Pidage meeles - klass on tüüp ja selle klassi objekt on lihtsalt klass muutuja.

Enne kui saame objekti kasutada, tuleb see luua. Klassi lihtsaim määratlus on:

 klassi nimi {

 // liikmed

 }


Allpool toodud näidisklass modelleerib lihtsat raamatut. OOP-i kasutamine võimaldab probleemi abstraktselt ja mitte ainult suvaliste muutujate mõeldes sellele mõelda.

 // üks näide

 # kaasata 

 # kaasata 


 klassi raamat

 {

 int PageCount;

 int CurrentPage; 

 avalik:

 Raamat (int. Numbrid); // Konstruktor

 ~ Raamat () {}; // Hävitaja

 tühine SetPage (int PageNumber);

 int GetCurrentPage (tühine);

 }; 


 Raamat:: Raamat (int NumPages) {

 PageCount = NumPages;

 }


 tühine raamat:: SetPage (sisenumber PageNumber) {
instagram viewer

 CurrentPage = PageNumber;

 }


 int raamat:: GetCurrentPage (tühine) {

 tagasi CurrentPage;

 }


 int main () {

 Raamat ABook (128);

 Raamat. SetPage (56);

 std:: cout << "Praegune leht" <
 tagasi 0;

 }


Kõik kood alates klassiraamat alla int raamat:: GetCurrentPage (tühine) { funktsioon on osa klassist. peamine () funktsioon on selleks, et muuta see käivitatavaks rakenduseks.

02

alates 09

Raamatuklassi mõistmine

Aastal peamine () funktsiooni jaoks luuakse muutuja AB-tüüpi tüüp Book väärtusega 128. Niipea kui täitmine sellesse punkti jõuab, ehitatakse objekt ABook. Järgmisel real meetod Raamat. SetPage () kutsutakse ja objekti muutujale omistatakse väärtus 56 Raamat. Käesolev lehekülg. Siis cout väljastab selle väärtuse, helistades Raamat. GetCurrentPage () meetod.

Kui täitmine jõuab tagasi 0; objekti ABook pole rakendusel enam vaja. Koostaja genereerib hävitajale kõne.

Klasside deklareerimine

Kõik vahel Klassiraamat ja } on klassi deklaratsioon. Selles klassis on kaks erasektori liiget, mõlemad tüüp int. Need on privaatsed, kuna vaikejuurdepääs klassi liikmetele on privaatne.

avalik: direktiiv ütleb koostaja mis siit edasi pääseb, on avalik. Ilma selleta oleks see endiselt privaatne ja takistaks funktsiooni main () kolme rida juurdepääsu Abooki liikmetele. Proovige kommentaari avalik: joondage ja kompileerige uuesti, et näha järgnevaid kompileerimisvigu.

Allpool olev rida kuulutab konstruktoriks. See on funktsioon, mida nimetatakse objekti esmakordsel loomisel.

 Raamat (int. Numbrid); // Konstruktor 

Seda kutsutakse joonelt

 Raamat ABook (128); 

See loob objekti nimega ABooküüp Book ja kutsub funktsiooni Book () üles klahviga parameeter 128.

03

alates 09

Veel raamatuklassist

C ++ puhul on konstruktoril alati sama nimi kui klassil. Ehitajale helistatakse siis, kui objekt luuakse, ja see on koht, kuhu peaksite objekti sisestamiseks oma koodi panema.

Raamatus Järgmine rida ehitaja järel. Sellel on konstruktoriga sama nimi, kuid selle ees on ~ (tilde). Objekti hävitamise ajal kutsutakse hävitaja objekti korrastama ja tagama, et objekti kasutatavad ressursid, näiteks mälu ja faili käepide vabastatakse.

Pidage meeles—Klassil xyz on konstruktorifunktsioon xyz () ja hävitajafunktsioonil ~ xyz (). Isegi kui te ei deklareeri, lisab kompilaator need vaikides.

Hävitajale helistatakse alati, kui objekt lõpetatakse. Selles näites hävitatakse objekt vaikimisi, kui see rakendusalast välja läheb. Selle nägemiseks muutke hävitaja deklaratsioon järgmiselt:

 ~ Raamat () {std:: cout << "Hävitaja kutsus";}; // Hävitaja 

See on deklaratsioonis koodiga funktsioon. Teine viis ritta on sõna lisamine

 tekstis ~ raamat (); // Hävitaja


ja lisage hävitaja selliseks funktsiooniks.

 tekstisisene raamat:: ~ Raamat (tühine) { 

 std:: cout << "Hävitaja kutsus";

 }


Sisefunktsioonid on näpunäited kompilaatorile efektiivsema koodi genereerimiseks. Neid tuleks kasutada ainult väikeste funktsioonide jaoks, kuid kui neid kasutatakse sobivates kohtades - näiteks sees silmuseid—Saab jõudluses märkimisväärselt erineda.

04

alates 09

Klassimeetodite kirjutamine

Parim harjutus objektide jaoks on kõigi andmete privaatseks muutmine ja neile juurdepääs juurdepääsute funktsioonidena tuntud funktsioonide kaudu. SetPage () ja GetCurrentPage () on kaks funktsiooni, mida kasutatakse objekti muutujale juurdepääsuks Käesolev lehekülg.

Muuda klass deklaratsioon struktureerida ja ümber kompileerida. See peaks ikkagi kompileerima ja õigesti töötama. Nüüd kaks muutujat PageCount ja Käesolev lehekülg on avalikult juurdepääsetavad. Lisage see rida pärast raamatut ABook (128) ja see kompileeritakse.

 Raamat. PageCount = 9;


Kui muudate struugi tagasi klass ja kompileerige uuesti, see uus rida ei kompileeru enam kui PageCount on nüüd jälle privaatne.

:: Märge

Pärast raamatuklassi deklaratsiooni põhiosa on olemas neli liikmefunktsioonide määratlust. Mõlemad on defineeritud eesliitega Book::, et tuvastada selle klassi kuulumine.:: nimetatakse ulatuse identifikaatoriks. See määratleb funktsiooni klassi kuuluvana. See on klassi deklaratsioonis ilmselge, kuid mitte väljaspool seda.

Kui olete kuulutanud klassi liikme funktsiooni, peate funktsiooni põhiosa sel viisil pakkuma. Kui soovite, et raamatuklassi kasutataks ka teistes failides, võite raamatu deklaratsiooni eraldi paigutada päis fail, mida võib-olla nimetatakse book.h. Mis tahes muu fail võiks siis selle koos olla

 #include "book.h" 

05

alates 09

Pärimine ja polümorfism

See näide näitab pärimist. See on kahe klassi rakendus, mille üks klass on teisest tuletatud.

 # kaasata 

 # kaasata 


 klassipunkt

 {


 int x, y;

 avalik:

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

 tekstisisene virtuaalne ~ punkt (); // Hävitaja

 virtuaalne tühisus Joonistamine ();

 }; 


 klassiring: avalik punkt {


 siseraadius;

 avalik:

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

 tekstisisene virtuaalne ~ ring ();

 virtuaalne tühisus Joonistamine ();

 };



 Punkt:: punkt (int atx, int aty) {

 x = atx;

 y = aty;

 }


 sisemine punkt:: ~ punkt (tühine) { 

 std:: cout << "Punkti hävitaja kutsus";

 }


 tühine punkt:: Joonista (tühine) {

 std:: cout << "Punkt:: Joonista punkt asukohta" << x << "" << y << std:: endl;

 }



 Ring: ring: ringi (int atx, int aty, int theRadius): punkt (atx, aty) {

 raadius = raadius;

 }


 tekstisisene ring:: ~ ring () {

 std:: cout << "Circle Destructor nimega" << std:: endl;

 }


 tühine ring:: Joonista (tühine) {

 Punkt: joonistada ();

 std:: cout << "ring:: Joonista punkt" << "Raadius" << raadius << std:: endl;

 }


 int main () {

 Circle ACircle (10,10,5);

 ACircle. Joonista ();

 tagasi 0;

 }


Näites on kaks klassi, punkt ja ring, mis modelleerivad punkti ja ringi. Punktil on x ja y koordinaadid. Ringi klass tuletatakse punktiklassist ja lisab raadiuse. Mõlemasse klassi kuulub a Joonista () liikme funktsioon. Selle näite lühikeseks jätmiseks on väljund lihtsalt tekst.

06

alates 09

Pärimine

Klass Ringi on tuletatud Punkt klass. Seda tehakse selles reas:

 klassi ring: punkt {


Kuna see on tuletatud põhiklassist (punkt), pärib Circle kõik klassi liikmed.

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

 tekstisisene virtuaalne ~ punkt (); // Hävitaja

 virtuaalne tühisus Joonistamine ();


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

 tekstisisene virtuaalne ~ ring ();

 virtuaalne tühisus Joonistamine ();


Mõelge Circle-klassile kui Point-klassile koos lisaelemendiga (raadiusega). See pärib põhiklassi liikme funktsioonid ja privaatsed muutujad x ja y.

Ta ei saa neid määrata ega kasutada, va kaudselt, kuna nad on privaatsed, seega peab ta seda tegema Circle konstruktori algataja loendi kaudu. Sellega peaksite nõustuma nagu praegu. Tuleksin tulevases õpetuses tagasi algatajate loendite juurde.

Ringi konstruktoris, enne seda theRadius on määratud raadius, ehitatakse ringi punkt Punkt initsialiseerijate loetelus üleskutse Pointi konstruktorile. Selles loendis on kõik järgmiste vahel: ja {allpool.

 Ring: ring: ringi (int atx, int aty, int theRadius): punkt (atx, aty) 


Muide, konstruktoritüübi lähtestamist saab kasutada kõigi sisseehitatud tüüpide jaoks.

 int a1 (10);

 int a2 = 10;


Mõlemad teevad sama.

07

alates 09

Mis on polümorfism?

Polümorfism on üldine termin, mis tähendab "paljusid kujundeid". C ++ puhul on polümorfismi lihtsaim vorm funktsioonide ülekoormamine. Näiteks mitu funktsiooni kutsus SortArray (massiivi tüüp) kus sortarray võib olla massiiv inti või kahekordistub.

Siiski huvitab meid siin vaid polümorfismi OOP-vorm. Selleks on vaja funktsiooni (nt joonistada ()) virtuaalne baasklassis Point ja seejärel alistab selle tuletatud klass Ringi.

Kuigi funktsioon Joonista () on tuletatud klassis virtuaalne Ringi, seda pole tegelikult vaja - see on lihtsalt meeldetuletus mulle, et see on virtuaalne. Kui tuletatud klassi funktsioon kattub nimiklassi ja parameetri tüübi põhiklassi virtuaalse funktsiooniga, on see automaatselt virtuaalne.

Punkti joonistamine ja ringi joonistamine on kaks väga erinevat toimingut, millel on ühised ainult punkti ja ringi koordinaadid, seega on oluline, et õige Joonista () kutsutakse. Seda, kuidas kompilaator õnnestub genereerida kood, mis saab õige virtuaalse funktsiooni, käsitletakse tulevases õpetuses.

08

alates 09

C ++ konstruktorid

Konstruktorid

Konstruktor on funktsioon, mis lähtestab objekti liikmed. Ehitaja teab ainult seda, kuidas ehitada oma klassi objekt.

Ehitajaid ei pärita automaatselt baas- ja tuletatud klasside vahel. Kui te ei sisesta ühtegi tuletatud klassi, pakutakse vaikimisi seadet, kuid see ei pruugi teha seda, mida soovite.

Kui ühtegi konstruktorit ei tarnita, loob kompilaator vaikevaliku ilma parameetriteta. Alati peab olema konstruktor, isegi kui see on vaikimisi ja tühi. Kui pakute konstruktorile parameetreid, siis vaikimisi EI looda.

Mõned punktid konstruktorite kohta:

  • Ehitajad on lihtsalt klassiga samanimelised funktsioonid.
  • Ehitajate eesmärk on lähtestada klassi liikmed selle klassi eksemplari loomisel.
  • Ehitajaid ei kutsuta otse (välja arvatud initsialiseerimisloendite kaudu)
  • Ehitajad pole kunagi virtuaalsed.
  • Sama klassi jaoks võib olla mitu konstruktorit. Nende eristamiseks peavad olema erinevad parameetrid.

Ehitajate kohta on veel palju õppida, näiteks vaikekonstruktorid, määramine ja kopeerimine. Neid arutatakse järgmises õppetunnis.

09

alates 09

C ++ hävitajate koristamine

Hävitaja on klassi liikme funktsioon, millel on konstruktoriga (ja klassiga) sama nimi, kuid ees on ~ (tilde).

 ~ Ring ();


Kui objekt läheb ulatusest välja või harvemini hävitatakse selgesõnaliselt, kutsutakse selle hävitaja. Näiteks kui objektil on dünaamilised muutujad, näiteks osutid, tuleb need vabastada ja hävitaja on sobiv koht.

Erinevalt konstruktoritest saab ja tuleb destruktoreid muuta virtuaalseks, kui olete klassid tuletanud. Aastal Punkt ja Ringi klasside näitel, hävitajat pole vaja, kuna puuduvad koristustööd (see on lihtsalt näide). Kui oleks olnud dünaamilisi liikmemuutujaid (nt osutid), siis oleks mälulekke vältimiseks need vaja vabastada.

Kui tuletatud klass lisab korrastamist vajavaid liikmeid, on vaja ka virtuaalseid hävitajaid. Kui virtuaalne, siis kõigepealt nimetatakse kõige tuletatud klassi hävitajat, siis kutsutakse selle vahetut esivanemate hävitajat ja nii edasi kuni põhiklassini.

Meie näites

 ~ Ring ();

siis

 ~ Punkt ();


Põhiklasside hävitajat nimetatakse viimaseks.

See õppetund lõpeb. Järgmises õppetükis saate teada vaikekonstruktorite, kopeerimiskonstruktorite ja määramise kohta.