C++ Klass ja objekt koos näitega
⚡ Nutikas kokkuvõte
Klassid ja objektid C++ moodustavad objektorienteeritud programmeerimise aluse, kus klass määratleb andmete ja liikmesfunktsioonide plaani ning objekt on selle plaani põhjal loodud konkreetne eksemplar.

Mis on klass?
A C++ klass ühendab andmed ja meetodid andmetega manipuleerimiseks üheks. Klassid määravad ka objektide vormid. Klassis sisalduvaid andmeid ja meetodeid nimetatakse klassiliikmeteks. Klass on kasutaja määratud andmetüüp. Klassi liikmetele juurdepääsu saamiseks kasutame klassi eksemplari. Saate klassi näha objekti plaanina.
Klass võib olla maja prototüüp. See näitab uste, akende, põrandate jne asukohta ja suurusi. Nende kirjelduste põhjal saame maja ehitada. Majast saab objekt. Prototüübist on võimalik luua palju maju. Samuti on klassist võimalik luua palju objekte.
Ülaltoodud joonisel on meil ühe maja prototüüp. Sellest prototüübist oleme loonud kaks erinevate omadustega maja.
Klassi kui plaani ideed silmas pidades on järgmine samm vaadata, kuidas seda koodis deklareeritakse.
Klassi deklaratsioon
In C++, klass defineeritakse märksõna „class” abil. Sellele peaks järgnema klassi nimi. Seejärel lisatakse klassi sisu looksulgude { } vahele.
Süntaks
class class-name { // data // functions };
- . klassi nimi on klassile määratav nimi.
- . andmed on klassi andmed, mis tavaliselt deklareeritakse muutujatena.
- . funktsioonid on klassifunktsioonid.
Klassi nime ja sisu deklareerimine tekitab loomulikult küsimuse, kes võib iga liiget kasutada.
Privaatsed ja avalikud märksõnad
Olete kindlasti nende kahe märksõnaga kokku puutunud. Need on juurdepääsu muutjad.
Private:
Kui privaatset märksõna kasutatakse funktsiooni või klassi määratlemiseks, muutub see privaatseks. Need on juurdepääsetavad ainult klassi seest.
Avalik:
Avalik märksõna seevastu muudab andmed/funktsioonid avalikuks. Need on juurdepääsetavad väljastpoolt klassi.
Pärast klassi olemasolu saab selle põhjal luua objekte, sarnaselt sellele, kuidas muutujaid luuakse andmetüübist.
Objekti määratlus
Objektid luuakse klassidest. Klassiobjektid deklareeritakse sarnaselt muutujate deklareerimisele. Klassi nimi peab olema esimene, millele järgneb objekti nimi. Objekt on klassi tüüpi.
Süntaks
class-name object-name;
- . klassi nimi on klassi nimi, millest objekt luuakse.
- . objekti nimi on uuele objektile määratav nimi.
Seda klassist objekti loomise protsessi nimetatakse instantseerimiseks.
Kui objekt on loodud, saab selle avalike liikmeteni otse lihtsa operaatori abil jõuda.
Juurdepääs andmete liikmetele
Klassi avalikele liikmetele juurdepääsemiseks kasutame (.)punkti operaatorit. Need on liikmed, mis on märgitud avaliku juurdepääsu modifikaatoriga.
Näiteks 1
#include <iostream> using namespace std; class Phone { public: double cost; int slots; }; int main() { Phone Y6; Phone Y7; Y6.cost = 100.0; Y6.slots = 2; Y7.cost = 200.0; Y7.slots = 2; cout << "Cost of Huawei Y6 : " << Y6.cost << endl; cout << "Cost of Huawei Y7 : " << Y7.cost << endl; cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl; cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl; return 0; }
Väljund:
Siin on koodi ekraanipilt:
Code Selgitus:
- Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
- Std-nimeruumi lisamine meie koodi, et kasutada selle klasse ilma seda kutsumata.
- Kuulutage klass nimega Telefon.
- Avaliku juurdepääsu modifikaatori kasutamine muutujate märkimiseks, mida me loome, avalikult juurdepääsetavateks.
- Deklareerige topeltandmetüübi muutuvkulu.
- Deklareerige täisarvuline muutuja nimega slots.
- Klassi keha lõpp.
- Funktsiooni main() kutsumine. Programmi loogika tuleks lisada selle kehasse.
- Looge objekt nimega Y6 tüübiga Telefon. Seda nimetatakse instantseerimiseks.
- Looge objekt nimega Y7 tüübiga Telefon. Seda nimetatakse instantseerimiseks.
- Juurdepääs klassi Telefon muutuv-/liikmekulule, kasutades objekti Y6. Väärtuseks on seatud 100.0. Y6 maksumuseks on nüüd määratud 100.0.
- Juurdepääs klassi Telefoni muutuja/liikme pesadele, kasutades objekti Y6. Väärtuseks on seatud 2. Y6 pesad on nüüd seatud väärtusele 2.
- Juurdepääs klassi Telefon muutuv-/liikmekulule, kasutades objekti Y7. Väärtuseks on seatud 200.0. Y7 maksumuseks on nüüd määratud 200.0.
- Juurdepääs klassi Telefoni muutuja/liikme pesadele, kasutades objekti Y7. Väärtuseks on seatud 2. Y7 pesad on nüüd seatud väärtusele 2.
- Printige Y6 maksumus konsoolile koos muu tekstiga.
- Printige Y7 maksumus konsoolile koos muu tekstiga.
- Printige Y6 pesade arv koos muu tekstiga.
- Printige Y7 pesade arv koos muu tekstiga.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Avalikud liikmed on avatud välisele koodile, kuid privaatsed liikmed järgivad palju rangemaid juurdepääsureegleid.
Mis on eraklass?
Privaatseks märgitud klassi liikmetele pääsevad juurde ainult klassis määratletud funktsioonid. Ükski väljaspool klassi määratletud objekt või funktsioon ei saa sellistele liikmetele otse juurde pääseda. Privaatklassi liikmele pääseb juurde ainult liikme ja sõbra funktsioonid.
Näiteks 2
#include <iostream> using namespace std; class ClassA { public: void set_a(int val); int get_a(void); private: int a; }; int ClassA::get_a(void) { return a; } void ClassA::set_a(int val) { a = val; } int main() { ClassA a; a.set_a(20); cout << "Value of a is: " << a.get_a(); return 0; }
Väljund:
Siin on koodi ekraanipilt:
Code Selgitus:
- Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
- Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Looge klass nimega ClassA.
- Kasutage avaliku juurdepääsu modifikaatorit, et märkida loodava klassi liige avalikult juurdepääsetavaks.
- Looge funktsioon nimega set_a(), mis võtab ühe täisarvu väärtuse val.
- Looge funktsioon nimega get_a().
- Kasutage privaatse juurdepääsu modifikaatorit, et märkida loodava klassi liige privaatselt juurdepääsetavaks.
- Deklareerida täisarvuline muutuja nimega a.
- Klassi keha lõpp.
- Funktsiooni get_a() kasutamiseks kasutage klassi nime ja ulatuse eraldusvõime operaatorit. Tahame määratleda, mida funktsioon käivitamisel teeb.
- Funktsioon get_a() peaks käivitamisel tagastama muutuja a väärtuse.
- Funktsiooni get_a() definitsiooni lõpp.
- Funktsioonile set_a() pääsemiseks kasutage klassi nime ja ulatuse eraldusvõime operaatorit. Tahame määratleda, mida funktsioon käivitamisel teeb.
- Muutuja val väärtuse omistamine muutujale a.
- Funktsiooni set_a() definitsiooni lõpp.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
- Looge klassi A eksemplar ja andke sellele nimi a.
- Kasutage ülaltoodud klassi eksemplari ja funktsiooni set_a(), et määrata muutujale a väärtus 20.
- Mõne teksti trükkimine konsooli muutuja a väärtuse kõrvale. Muutuja a väärtus saadakse funktsiooni get_a() kutsumisega.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Kaitstud liikmed paiknevad privaatse ja avaliku vahel, lisades ühe olulise pärimisvõimaluse.
Mis on kaitstud klass?
Kaitstuks märgitud klassi liikmetel on eelised privaatseks märgitute ees. Neile pääseb juurde nende määratluse klassi kuuluvate funktsioonide kaudu. Lisaks pääseb neile juurde tuletatud klassidest.
Näiteks 3
#include <iostream> using namespace std; class ParentClass { protected: int value; }; class ChildClass : public ParentClass { public: void setId(int x) { value = x; } void displayValue() { cout << "Value is: " << value << endl; } }; int main() { ChildClass c; c.setId(21); c.displayValue(); return 0; }
Väljund:
Siin on koodi ekraanipilt:
Code Selgitus:
- Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
- Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Looge klass nimega ParentClass.
- Kasutage kaitstud juurdepääsu modifikaatorit, et märkida loodava klassi liige kaitstuks.
- Looge täisarvuline muutuja nimega väärtus.
- Klassi keha lõpp.
- Looge uus klass nimega ChildClass, mis pärib ParentClassi.
- Kasutage kaitstud juurdepääsu modifikaatorit, et märkida loodava klassi liige alamklassidele juurdepääsetavaks.
- Looge funktsioon nimega setId(), mis võtab ühe täisarvu väärtuse x.
- Muutuja x väärtuse omistamine muutuja väärtusele.
- Funktsiooni setId() definitsiooni lõpp.
- Looge funktsioon nimega displayValue().
- Printige konsoolile koos muu tekstiga muutuja nimega väärtus väärtus.
- Funktsiooni displayValue() põhiosa lõpp.
- Klassi kehaosa lõpp nimega ChildClass.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
- Looge ChildClassi eksemplar ja andke sellele nimi c.
- Kasutage ülaltoodud klassi eksemplari ja funktsiooni setId(), et määrata muutujale x väärtus 21.
- Kasutage ülaltoodud klassi eksemplari funktsiooni displayValue() kutsumiseks.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Lisaks andmete salvestamisele rühmitab klass ka funktsioone, mis nende andmetega töötavad.
Klassiliikme funktsioonid
Funktsioonid aitavad meil andmetega manipuleerida. Klassiliikme funktsioone saab defineerida kahel viisil:
- Klassi määratluse sees
- Väljaspool klassi määratlust
Kui funktsioon tuleb määratleda väljaspool klassimääratlust, peame kasutama ulatuse eraldusvõime operaatorit (::). Sellele tuleks lisada klasside ja funktsioonide nimed.
Näiteks 4
#include <iostream> #include <string> using namespace std; class Guru99 { public: string tutorial_name; int id; void printname(); void printid() { cout << "Tutorial id is: "<< id; } }; void Guru99::printname() { cout << "Tutorial name is: " << tutorial_name; } int main() { Guru99 guru99; guru99.tutorial_name = "C++"; guru99.id = 1001; guru99.printname(); cout << endl; guru99.printid(); return 0; }
Väljund:
Siin on koodi ekraanipilt:
Code Selgitus:
- Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
- Selle funktsioonide kasutamiseks lisage meie programmi stringi päise fail.
- Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Looge klass nimega Guru99.
- Kasutage avaliku juurdepääsu modifikaatorit, et märkida loodavad klassiliikmed avalikult ligipääsetavateks.
- Looge stringi muutuja nimega õpetuse_nimi.
- Looge täisarvuline muutuja nimega id.
- Looge funktsioon nimega printname(). Seda funktsiooni ei ole klassimääratluses määratletud.
- Loo funktsioon nimega printid(). See funktsioon on defineeritud klassi definitsioonis. Selle sisu on lisatud klassi definitsiooni.
- Printige muutuja id väärtus koos muu konsooli tekstiga. Pange tähele, et see on lisatud funktsiooni printid() kehasse. See käivitatakse ainult funktsiooni printid() väljakutsumisel.
- Funktsiooni printid() keha lõpp.
- Klassi sisu lõpp Guru99.
- Funktsiooni printname() määratluse algus.
- Printige konsoolile koos muu tekstiga muutuja tutorial_name väärtus. Pange tähele, et see on lisatud funktsiooni printname() kehasse. See käivitatakse ainult funktsiooni printname() väljakutsumisel.
- Funktsiooni printname() definitsiooni lõpp.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
- Loo klassi eksemplar Guru99 ja andes sellele nimeks guru99.
- Kasutage ülaltoodud eksemplari väärtuse määramiseks C++ muutujale tutorial_name.
- Kasutage guru99 eksemplari, et määrata muutujale id väärtus 1001.
- Funktsiooni printname() kutsumiseks kasutage eksemplari guru99.
- Konsoolile uue tühja rea printimiseks helistage käsule end (end line).
- Funktsiooni printid() kutsumiseks kasutage eksemplari guru99.
- Programm peab pärast edukat lõpetamist tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Objekti loomisel ja hävitamisel käivituvad automaatselt kaks spetsiaalset liikmesfunktsiooni.
Konstruktorid ja hävitajad
Mis on konstruktor?
Konstruktorid on spetsiaalsed funktsioonid, mis initsialiseerivad objekte. C++ koostajad Objekti loomisel kutsutakse välja konstruktor. Konstruktorid aitavad klassi liikmetele väärtusi määrata. Loomulikult toimub see pärast seda, kui neile on eraldatud mäluruumi.
Mis on destruktor?
Destruktorid seevastu aitavad hävitada klassiobjekte.
Konstruktori nimi peab olema klassi nimega sarnane. Konstruktoril ei ole tagastustüüpi.
Konstruktorit saab määratleda klassi keha sees või väljaspool. Kui see on määratletud väljaspool klassi keha, tuleks see määratleda klassi nime ja ulatuse eraldusoperaatoriga (::).
Näiteks 5
#include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "Class constructor called"<<endl; } ~ClassA() { cout << "Class destructor called"<<endl; } }; int main() { ClassA a; int p = 1; if (p) { ClassA b; } }
Väljund:
Siin on koodi ekraanipilt:
Code Selgitus:
- Selle funktsioonide kasutamiseks lisage koodi iostreami päisefail.
- Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Looge klass nimega ClassA.
- Kasutage avaliku juurdepääsu modifikaatorit, et märkida liige, mida loome, avalikult juurdepääsetavaks.
- Loo klassi jaoks konstruktor.
- Tekst, mis prinditakse konsoolile, kui kutsutakse konstruktor. Endl on a C++ märksõna, mis tähendab lõpprida. See viib hiirekursori järgmisele reale.
- Klassi konstruktori keha lõpp.
- Looge klassi jaoks hävitaja.
- Destrutori kutsumisel konsoolile prinditav tekst. Endl on a C++ märksõna, mis tähendab lõpprida. See viib hiirekursori järgmisele reale.
- Destruktori kere ots.
- Klassi keha lõpp.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
- Loo klassi objekt ja pane sellele nimi a. Kutsutakse ehitaja.
- Looge täisarvuline muutuja nimega p ja määrake sellele väärtus 1.
- Loo if-lause plokk, kasutades muutujat p.
- Loo klassi objekt ja pane sellele nimi b. Hävitaja kutsutakse.
- Kui-lause põhiosa lõpp.
- Funktsiooni main() keha lõpp.








