Įvadas į C ++ klases ir objektus

01

iš 09

Pradinės C ++ klasės

Rankos rašomos nešiojamu kompiuteriu
Sam Edwards / „Getty Images“

Objektai yra didžiausias skirtumas tarp C ++ ir C. Vienas ankstyviausių C ++ pavadinimų buvo C su klasėmis.

Klasės ir objektai

Klasė yra objekto apibrėžimas. Tai toks pat tipas tarpt. Klasė primena a struktūra tik su vienu skirtumu: pagal nutylėjimą visi struktūros nariai yra vieši. Visi užsiėmimai yra privatūs.

Atminkite - klasė yra rūšis, o šios klasės objektas yra tik kintamasis.

Kad galėtume naudoti objektą, jis turi būti sukurtas. Paprasčiausias klasės apibrėžimas yra:

 klasės pavadinimas {

 // nariai

 }


Ši pavyzdinė klasė modeliuoja paprastą knygą. Naudodami OOP galite išspręsti problemą ir galvoti apie ją, o ne tik apie savavališkus kintamuosius.

 // vienas pavyzdys

 # įtraukti 

 # įtraukti 


 klasės knyga

 {

 int PageCount;

 int „CurrentPage“; 

 viešas:

 Knyga (int. Skaitiniai); // Konstruktorius

 ~ Knyga () {}; // Naikintojas

 void SetPage (int PageNumber);

 int „GetCurrentPage“ (negalioja);

 }; 


 Knyga:: knyga (int. „NumPages“) {

 „PageCount“ = „NumPages“;
instagram viewer

 }


 negaliojanti knyga:: „SetPage“ (vid. puslapio numeris) {

 Dabartinis puslapis = puslapio numeris;

 }


 int knyga: „GetCurrentPage“ (negalioja) {

 grąžinti „CurrentPage“;

 }


 int pagrindinis () {

 Knyga „ABook“ (128);

 Knyga. „SetPage“ (56);

 std:: cout << „Dabartinis puslapis“ <
 grįžti 0;

 }


Visas kodas iš klasės knyga iki int knyga: „GetCurrentPage“ (negalioja) { funkcija yra klasės dalis. pagrindinis () funkcija yra tam, kad tai būtų paleidžiama programa.

02

iš 09

Knygos klasės supratimas

Viduje pagrindinis () Funkcijai sukuriamas kintamasis „Bookook“ tipo „Bookook“, kurio vertė 128. Kai tik vykdymas pasiekia šį tašką, objektas „ABook“ yra sukonstruojamas. Kitoje eilutėje metodas Knyga. „SetPage“ () vadinamas ir objekto kintamajam priskiriama 56 vertė Knyga. Dabartinis puslapis. Tada cout išveda šią vertę paskambinus Knyga. „GetCurrentPage“ () metodas.

Kai vykdymas pasieks grįžti 0; objekto „ABook“ nebereikia programai. Kompiliatorius sušaukia griovėją.

Deklaruojančios klases

Viskas tarp Klasės knyga ir } yra klasės deklaracija. Šioje klasėje yra du privatūs nariai, abu yra int. Jos yra privačios, nes numatytoji prieiga prie klasės narių yra privati.

viešas: direktyva sako sudarytojas kad prieigos iš čia yra viešos. Be to, ji vis tiek būtų privati ​​ir neleistų trims pagrindinės () funkcijos eilutėms pasiekti „Abook“ narių. Pabandykite pakomentuoti viešas: išdėstykite ir perkompiliuokite, kad pamatytumėte iš to kylančias kompiliavimo klaidas.

Ši eilutė skelbia konstruktorių. Tai yra funkcija, vadinama, kai objektas pirmą kartą sukuriamas.

 Knyga (int. Skaitiniai); // Konstruktorius 

Jis vadinamas iš linijos

 Knyga „ABook“ (128); 

Tai sukuria objektą, vadinamą „Bookook“ tipo knyga, ir iškviečia Book () funkciją su parametras 128.

03

iš 09

Daugiau apie knygų klasę

C ++ konstruktorius visada turi tą patį pavadinimą kaip klasė. Konstruktorius iškviečiamas, kai objektas yra sukuriamas, ir yra vieta, kur turėtumėte įdėti savo kodą, kad inicijuotumėte objektą.

Knygoje Kita eilutė po konstruktoriaus griovėjo. Jis turi tą patį pavadinimą kaip konstruktorius, bet priešais jį yra ženklas ~ (tilde). Naikinant objektą, naikintojas kviečiamas sutvarkyti objektą ir įsitikinti, kad objekto naudojami ištekliai, tokie kaip atmintis ir failų tvarkyklė, yra išlaisvinti.

Prisiminti—Klass xyz turi konstruktoriaus funkciją xyz () ir naikintojo funkciją ~ xyz (). Net jei nedeklaruosite, kompiliatorius tyliai juos pridės.

Naikintojui visada šaukiama, kai objektas nutraukiamas. Šiame pavyzdyje objektas yra netiesiogiai sunaikinamas, kai jis nebetaikomas. Norėdami tai pamatyti, pakeiskite destruktoriaus deklaraciją taip:

 ~ Knyga () {std:: cout << "Naikintojas pašauktas";}; // Naikintojas 

Tai yra įtraukta funkcija su kodu deklaracijoje. Kitas būdas įterpti yra žodžio „įterpimas“ pridėjimas

 inline ~ knyga (); // Naikintojas


ir pridėkite naikintoją kaip tokią funkciją.

 inline knyga:: ~ knyga (negalioja) { 

 std:: cout << „Naikintojas vadinamas“;

 }


Inline funkcijos yra patarimai kompiliatoriui, kad būtų sukurtas efektyvesnis kodas. Jie turėtų būti naudojami tik nedidelėms funkcijoms, tačiau jei jie naudojami tinkamose vietose, pavyzdžiui, viduje kilpos—Gali žymiai pakeisti našumą.

04

iš 09

Rašymo klasės metodai

Geriausia praktika Objektų paskirtis yra padaryti visus duomenis privačius ir pasiekti juos naudojantis funkcijomis, vadinamomis prieigos funkcijomis. „SetPage“ () ir „GetCurrentPage“ () yra dvi funkcijos, naudojamos prieigai prie objekto kintamojo Dabartinis puslapis.

Pakeisti klasė deklaracija struktūrizuoti ir perkompiliuoti. Jis vis tiek turėtų būti teisingai kompiliuotas ir paleistas. Dabar du kintamieji „PageCount“ ir Dabartinis puslapis yra viešai prieinami. Pridėkite šią eilutę po knygos „ABook“ (128) ir ji sudarys.

 Knyga. „PageCount“ = 9;


Jei pakeisite struktūrą atgal į klasė ir perkompiliuokite, ta nauja eilutė nebebus kaupiama kaip „PageCount“ dabar vėl privati.

:: žymėjimas

Po „Book Class“ deklaracijos turinio yra keturi narių funkcijų apibrėžimai. Kiekvienas jų yra apibrėžtas priešdėliu „Book ::“, kad būtų galima identifikuoti jį kaip tą klasę.:: vadinamas apimties identifikatoriumi. Ji nurodo, kad funkcija yra klasės dalis. Tai akivaizdu klasės deklaracijoje, bet ne už jos ribų.

Jei esate paskelbę nario funkciją klasėje, tokiu būdu turite pateikti funkcijos pagrindą. Jei norite, kad knygų klasę naudotų kiti failai, tuomet galite deklaraciją apie knygą perkelti į atskirą antraštė failas, galbūt vadinamas book.h. Bet kuris kitas failas gali būti įtrauktas į jį

 #include „book.h“ 

05

iš 09

Paveldimumas ir polimorfizmas

Šis pavyzdys parodys paveldėjimą. Tai yra dviejų klasių programa, iš kurios viena klasė gaunama iš kitos.

 # įtraukti 

 # įtraukti 


 klasės taškas

 {


 int x, y;

 viešas:

 Taškas (int atx, int aty); // Konstruktorius

 integruotas virtualus ~ taškas (); // Naikintojas

 virtual void Draw ();

 }; 


 klasės ratas: viešas taškas {


 vidinis spindulys;

 viešas:

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

 įterptas virtualus ~ apskritimas ();

 virtual void Draw ();

 };



 Taškas:: Taškas (int atx, int aty) {

 x = atx;

 y = atijus;

 }


 įterptas taškas:: ~ Taškas (negalioja) { 

 std:: cout << "Taškinis naikintojas vadinamas";

 }


 void point:: Draw (void) {

 std:: cout << "Taškas:: Nubrėžkite tašką ties" << x << "" << y << std:: endl;

 }



 Apskritimas:: apskritimas (int atx, int aty, int theRadius): taškas (atx, aty) {

 spindulys = theRadius;

 }


 linijinis apskritimas:: ~ apskritimas () {

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

 }


 negaliojantis apskritimas:: Lygiosios (negalioja) {

 Taškas:: Lygiosios ();

 std:: cout << "apskritimas:: Brėžti tašką" << "Spindulys" << spindulys << std:: endl;

 }


 int pagrindinis () {

 Apskritimo apskritimas (10,10,5);

 Apskritimas. Lygiosios ();

 grįžti 0;

 }


Pavyzdys turi dvi klases - tašką ir apskritimą, modeliuojantį tašką ir apskritimą. Taškas turi x ir y koordinates. Apskritimo klasė gaunama iš taško klasės ir prideda spindulį. Abiejose klasėse yra: Lygiosios () nario funkcija. Kad šis pavyzdys būtų trumpas, išvestis yra tik tekstas.

06

iš 09

Paveldimumas

Klasė Apskritimas yra kilęs iš Taškas klasė. Tai daroma šioje eilutėje:

 klasės ratas: taškas {


Kadangi jis yra kilęs iš pagrindinės klasės (taško), „Circle“ paveldi visus klasės narius.

 Taškas (int atx, int aty); // Konstruktorius

 integruotas virtualus ~ taškas (); // Naikintojas

 virtual void Draw ();


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

 įterptas virtualus ~ apskritimas ();

 virtual void Draw ();


Apsvarstykite apskritimo klasę kaip taškinę klasę su papildomu elementu (spinduliu). Jis paveldi bazinės klasės narių funkcijas ir privačius kintamuosius x ir y.

Ji negali jų priskirti ar naudoti, išskyrus netiesiogiai, nes jie yra privatūs, todėl ji turi tai padaryti per „Circle“ konstruktoriaus iniciatorių sąrašą. Tai turėtumėte sutikti su šiuo metu. Grįšiu prie iniciatorių sąrašų būsimame vadove.

„Circle konstruktoriuje“, prieš tai theRadius yra priskirtas spindulys, taško apskritimo dalis yra sukonstruota iškvietus taško konstruktorių į iniciatorių sąrašą. Šiame sąraše yra viskas, kas yra tarp: ir {žemiau.

 Apskritimas:: apskritimas (int atx, int aty, int theRadius): taškas (atx, aty) 


Beje, konstruktoriaus tipo inicijavimas gali būti naudojamas visiems įmontuotiems tipams.

 int a1 (10);

 int a2 = 10;


Abu daro tą patį.

07

iš 09

Kas yra polimorfizmas?

Polimorfizmas yra bendras terminas, reiškiantis „daug formų“. C ++ atveju paprasčiausia polimorfizmo forma yra funkcijų perkrovimas. Pavyzdžiui, vadinamos kelios funkcijos „SortArray“ (masyvo tipas) kur gali būti sortarray masyvas intų arba dvigubai.

Vis dėlto čia mus domina tik OOP polimorfizmo forma. Tai atliekama atlikus funkciją (pvz., Draw ()) virtualus bazinės klasės taške ir tada jį pakeisdamas išvestinė klasė Apskritimas.

Nors funkcija Lygiosios () yra virtuali išvestinėje klasėje Apskritimas, to iš tikrųjų nereikia - tai tik priminimas man, kad tai yra virtualu. Jei išvestinės klasės funkcija atitinka vardo ir parametrų tipų bazinėje klasėje esančią virtualią funkciją, ji automatiškai yra virtuali.

Taško ir apskritimo brėžinys yra dvi labai skirtingos operacijos, turinčios tik taško ir apskritimo koordinates, todėl svarbu, kad būtų teisinga Lygiosios () vadinamas. Kaip kompiliatoriui pavyks sugeneruoti kodą, kuris gauna reikiamą virtualią funkciją, bus aptarta būsimoje mokymo programoje.

08

iš 09

C ++ konstruktoriai

Konstruktoriai

Konstruktorius yra funkcija, kuri inicijuoja objekto narius. Konstruktorius tik žino, kaip pastatyti savo klasės objektą.

Tarp pagrindinės ir išvestinės klasės konstruktoriai nėra automatiškai paveldimi. Jei nepateiksite vienos išvestinėje klasėje, bus numatytasis numatytasis nustatymas, tačiau tai gali nedaryti to, ko norite.

Jei konstruktorius nepateikiamas, kompiliatorius sukuria numatytąjį parametrą be jokių parametrų. Visada turi būti konstruktorius, net jei jis yra numatytasis ir tuščias. Jei aprūpinsite konstruktorių parametrais, numatytoji reikšmė NEGALI būti sukurta.

Keletas punktų apie konstruktorius:

  • Konstruktoriai yra tik funkcijos tuo pačiu pavadinimu kaip klasė.
  • Konstruktoriai skirti inicijuoti klasės narius, kai sukuriamas tos klasės egzempliorius.
  • Konstruktoriai nėra tiesiogiai vadinami (išskyrus per iniciatorių sąrašus)
  • Konstruktoriai niekada nebūna virtualūs.
  • Gali būti apibrėžti keli tos pačios klasės konstruktoriai. Norint juos atskirti, jie turi turėti skirtingus parametrus.

Yra daug daugiau sužinoti apie konstruktorius, pavyzdžiui, numatytuosius konstruktorius, priskyrimo ir kopijavimo konstruktorius. Tai bus aptarta kitoje pamokoje.

09

iš 09

C ++ naikintojų sutvarkymas

Griovėjas yra klasės nario funkcija, turinti tą patį pavadinimą kaip konstruktorius (ir klasė), bet priekyje ~ (tilde).

 ~ Apskritimas ();


Kai objektas netenka galios arba rečiau yra aiškiai sunaikinamas, vadinamas jo naikintoju. Pavyzdžiui, jei objekte yra dinaminių kintamųjų, tokių kaip rodyklės, tada juos reikia išlaisvinti, o destruktorius yra tinkama vieta.

Skirtingai nuo konstruktorių, destruktoriai gali ir turėtų būti virtualūs, jei turite išvestas klases. Viduje Taškas ir Apskritimas klasių pavyzdžiu, griovėjas nėra reikalingas, nes nėra jokių valymo darbų, kuriuos reikia atlikti (jis tiesiog naudojamas kaip pavyzdys). Jei ten būtų buvę dinaminių narių kintamųjų (pvz., rodyklės), tada tiems, kuriuos būtų reikėję atlaisvinti, kad būtų išvengta atminties nutekėjimo.

Be to, kai išvestinė klasė prideda narius, kuriuos reikia sutvarkyti, reikia virtualių naikintojų. Kai virtualus, pirmiausia iškviečiamas labiausiai išvestas klasės naikintojas, tada vadinamas tiesioginis jo protėvio naikintojas ir tt iki pagrindinės klasės.

Mūsų pavyzdyje

 ~ Apskritimas ();

tada

 ~ Taškas ();


Bazinių klasių griovėjas vadinamas paskutiniu.

Tai užbaigia šią pamoką. Kitoje pamokoje sužinokite apie numatytuosius konstruktorius, jų kopijavimo konstruktorius ir užduotis.