C++ Luokka ja objekti esimerkin kanssa
โก รlykรคs yhteenveto
Luokat ja objektit C++ muodostavat olio-ohjelmoinnin perustan, jossa luokka mรครคrittelee datan ja jรคsenfunktioiden suunnitelman ja objekti on tรคstรค suunnitelmasta luotu konkreettinen instanssi.

Mikรค on luokka?
A C++ luokka yhdistรครค tiedot ja menetelmรคt tietojen kรคsittelemiseksi yhdeksi. Luokat mรครคrรครคvรคt myรถs objektien muodot. Luokkaan sisรคltyvรคt tiedot ja menetelmรคt tunnetaan luokan jรคseninรค. Luokka on kรคyttรคjรคn mรครคrittรคmรค tietotyyppi. Kรคyttรครคksemme luokan jรคseniรค kรคytรคmme luokan esiintymรครค. Voit nรคhdรค luokan objektin suunnitelmana.
Luokka voi olla talon prototyyppi. Se nรคyttรครค ovien, ikkunoiden, lattioiden jne. sijainnin ja koot. Nรคiden kuvausten perusteella voimme rakentaa talon. Talosta tulee objekti. Prototyypistรค on mahdollista luoda useita taloja. Luokasta on myรถs mahdollista luoda useita objekteja.
Yllรค olevassa kuvassa meillรค on yhden talon prototyyppi. Tรคstรค prototyypistรค olemme luoneet kaksi taloa, joissa on erilaisia โโominaisuuksia.
Kun ajatellaan luokkaa suunnitelmana, seuraava vaihe on nรคhdรค, miten se deklaroidaan koodissa.
Luokkailmoitus
In C++, luokka mรครคritellรครคn avainsanalla class. Tรคmรคn perรครคn tulee luokan nimi. Luokan runko lisรคtรครคn sitten aaltosulkeiden { } vรคliin.
Syntaksi
class class-name { // data // functions };
- luokan nimi on luokalle annettava nimi.
- tiedot on luokan data, joka yleensรค deklaroidaan muuttujina.
- tehtรคvรคt ovat luokkafunktioita.
Luokan nimen ja rungon mรครคrittรคminen herรคttรครค luonnollisesti kysymyksen siitรค, kuka voi kรคyttรครค kutakin jรคsentรค.
Yksityiset ja julkiset avainsanat
Olet varmaan tรถrmรคnnyt nรคihin kahteen avainsanaan. Ne ovat pรครคsyn muokkaajia.
yksityinen:
Kun yksityistรค avainsanaa kรคytetรครคn funktion tai luokan mรครคrittรคmiseen, siitรค tulee yksityinen. Sellaiset ovat kรคytettรคvissรค vain luokasta kรคsin.
Julkinen:
Julkinen avainsana puolestaan โโtekee tiedoista/funktioista julkisia. Nรคihin pรครคsee kรคsiksi luokan ulkopuolelta.
Kun luokka on luotu, siitรค voidaan luoda olioita, aivan kuten muuttujia luodaan tietotyypistรค.
Objektin mรครคritelmรค
Objektit luodaan luokista. Luokkaobjektit deklaroidaan samalla tavalla kuin muuttujat. Luokan nimen on oltava ensin ja sen jรคlkeen objektin nimi. Objekti on luokkatyyppiรค.
Syntaksi
class-name object-name;
- luokan nimi on sen luokan nimi, josta objekti luodaan.
- objektin nimi on uudelle objektille annettava nimi.
Tรคtรค objektin luomisprosessia luokasta kutsutaan instanssiksi.
Kun objekti on luotu, sen julkisiin jรคseniin voidaan tavoittaa suoraan yksinkertaisen operaattorin avulla.
Tietojen jรคsenten kรคyttรถ
Luokan julkisiin jรคseniin pรครคsemiseksi kรคytรคmme (.)piste-operaattoria. Nรคmรค ovat jรคseniรค, jotka on merkitty julkisen kรคyttรถoikeuden muokkaajalla.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto koodiimme, jotta voit kรคyttรครค sen toimintoja.
- std-nimiavaruuden sisรคllyttรคminen koodiimme kรคyttรครคksemme sen luokkia kutsumatta sitรค.
- Ilmoita luokka nimeltรค Puhelin.
- Julkisen kรคyttรถoikeuden muokkaimen kรคyttรคminen merkitsemรครคn muuttujat, joita olemme luomassa, julkisesti saatavilla oleviksi.
- Ilmoita kaksoistietotyypin muuttuvat kustannukset.
- Ilmoita kokonaislukumuuttuja nimeltรค slots.
- Luokan rungon loppu.
- Main()-funktion kutsuminen. Ohjelmalogiikka tulisi lisรคtรค sen runkoon.
- Luo objekti nimeltรค Y6, jonka tyyppi on Puhelin. Tรคtรค kutsutaan instantiaatioksi.
- Luo objekti nimeltรค Y7, jonka tyyppi on Puhelin. Tรคtรค kutsutaan instantiaatioksi.
- Pรครคset luokan Puhelin muuttuja-/jรคsenkustannuksiin objektilla Y6. Arvoksi on asetettu 100.0. Y6:n hinta on nyt 100.0.
- Siirry luokan Puhelin muuttuja-/jรคsenpaikkoihin objektin Y6 avulla. Arvoksi on asetettu 2. Y6:n paikat on nyt asetettu arvoon 2.
- Pรครคset luokan Puhelin muuttuja-/jรคsenkustannuksiin objektilla Y7. Arvoksi on asetettu 200.0. Y7:n hinta on nyt 200.0.
- Siirry luokan Puhelin muuttuja-/jรคsenpaikkoihin objektin Y7 avulla. Arvoksi on asetettu 2. Y7:n paikat on nyt asetettu arvoon 2.
- Tulosta Y6:n hinta konsoliin muun tekstin viereen.
- Tulosta Y7:n hinta konsoliin muun tekstin viereen.
- Tulosta Y6-paikkojen mรครคrรค muun tekstin viereen.
- Tulosta Y7-paikkojen mรครคrรค muun tekstin viereen.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.
Julkiset jรคsenet ovat avoimia ulkopuoliselle koodille, mutta yksityiset jรคsenet noudattavat paljon tiukempia kรคyttรถoikeussรครคntรถjรค.
Mikรค on yksityinen luokka?
Yksityisiksi merkittyjรค luokan jรคseniรค voi kรคyttรครค vain luokassa mรครคritellyillรค toiminnoilla. Mikรครคn luokan ulkopuolella mรครคritelty objekti tai funktio ei voi kรคyttรครค tรคllaisia โโjรคseniรค suoraan. Yksityisen luokan jรคseneen pรครคsee vain jรคsen- ja ystรคvรคtoimintojen kautta.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto koodiimme kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค std-nimiavaruus koodiimme kรคyttรครคksesi sen luokkia kutsumatta sitรค.
- Luo luokka nimeltรค ClassA.
- Kรคytรค julkisen kรคyttรถoikeuden muokkaajaa merkitรคksesi luotava luokan jรคsen julkisesti kรคytettรคvรคksi.
- Luo funktio nimeltรค set_a(), joka ottaa yhden kokonaisluvun arvon val.
- Luo funktio nimeltรค get_a().
- Kรคytรค yksityisen kรคyttรถoikeuden muokkaajaa merkitรคksesi luotava luokan jรคsen yksityisesti kรคytettรคvissรค olevaksi.
- Ilmoita kokonaislukumuuttuja nimeltรค a.
- Luokan rungon loppu.
- Kรคytรค luokan nimeรค ja laajuuden resoluutiooperaattoria pรครคstรคksesi funktioon get_a(). Haluamme mรครคrittรครค, mitรค toiminto tekee, kun sitรค kutsutaan.
- Funktio get_a() palauttaa muuttujan a arvon, kun sitรค kutsutaan.
- Funktion get_a() mรครคritelmรคn loppu.
- Kรคytรค luokan nimeรค ja laajuuden resoluutiooperaattoria pรครคstรคksesi funktioon set_a(). Haluamme mรครคrittรครค, mitรค toiminto tekee, kun sitรค kutsutaan.
- Muuttujan val arvon antaminen muuttujalle a.
- Funktion set_a() mรครคritelmรคn loppu.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
- Luo ClassA esiintymรค ja anna sille nimi a.
- Kรคytรค yllรค olevaa luokkainstanssia ja funktiota set_a() mรครคrittรครคksesi muuttujalle a arvon 20.
- Tulostetaan tekstiรค konsoliin muuttujan a arvon rinnalle. Muuttujan a arvo saadaan kutsumalla get_a()-funktiota.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Funktion main() rungon loppu.
Suojatut jรคsenet sijaitsevat yksityisen ja julkisen vรคlissรค, mikรค lisรครค yhden keskeisen periytymisominaisuuden.
Mikรค on suojattu luokka?
Suojatuiksi merkityillรค luokan jรคsenillรค on etuoikeus yksityisiksi merkittyihin verrattuna. Niitรค voidaan kรคyttรครค mรครคritellyn luokan funktioilla. Lisรคksi niihin pรครคsee kรคsiksi johdetuista luokista.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto koodiimme kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค std-nimiavaruus koodiimme kรคyttรครคksesi sen luokkia kutsumatta sitรค.
- Luo luokka nimeltรค ParentClass.
- Kรคytรค suojatun kรคyttรถoikeuden muokkaajaa merkitรคksesi luotava luokan jรคsen suojatuksi.
- Luo kokonaislukumuuttuja nimeltรค arvo.
- Luokan rungon loppu.
- Luo uusi luokka nimeltรค ChildClass, joka perii ParentClassin.
- Kรคytรค suojatun kรคyttรถoikeuden muokkaajaa merkitรคksesi luotava luokan jรคsen lapsiluokkien kรคytettรคvรคksi.
- Luo funktio nimeltรค setId(), joka ottaa yhden kokonaisluvun arvon x.
- Muuttujan x arvon mรครคrittรคminen muuttujan arvoon.
- Funktion setId() mรครคritelmรคn loppu.
- Luo funktio nimeltรค displayValue().
- Tulosta muuttujan arvo nimetty arvo konsoliin muun tekstin rinnalle.
- Funktion displayValue() rungon loppu.
- Luokan rungon loppu nimeltรค ChildClass.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
- Luo ChildClass-esiintymรค ja anna sille nimi c.
- Kรคytรค yllรค olevaa luokkaesiintymรครค ja funktiota setId() mรครคrittรครคksesi muuttujalle x arvon 21.
- Kรคytรค yllรค olevaa luokkaesiintymรครค kutsuaksesi funktiota nimeltรค displayValue().
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Funktion main() rungon loppu.
Tiedon tallentamisen lisรคksi luokka ryhmittelee myรถs funktiot, jotka kรคsittelevรคt kyseistรค tietoa.
Luokan jรคsentoiminnot
Toiminnot auttavat meitรค kรคsittelemรครคn tietoja. Luokan jรคsenfunktiot voidaan mรครคrittรครค kahdella tavalla:
- Luokan mรครคritelmรคn sisรคllรค
- Luokan mรครคritelmรคn ulkopuolella
Jos funktio halutaan mรครคritellรค luokkamรครคrittelyn ulkopuolella, meidรคn on kรคytettรคvรค laajuuden resoluutiooperaattoria (::). Tรคhรคn tulee liittรครค luokan ja funktion nimet.
Esimerkki 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; }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto ohjelmaamme kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค merkkijonootsikkotiedosto ohjelmaamme kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค std-nimiavaruus koodiimme kรคyttรครคksesi sen luokkia kutsumatta sitรค.
- Luo luokka nimeltรค Guru99.
- Kรคytรค julkisen kรคyttรถoikeuden muokkaajaa merkitรคksesi luomamme luokan jรคsenet julkisesti saatavilla oleviksi.
- Luo merkkijonomuuttuja nimeltรค tutorial_name.
- Luo kokonaislukumuuttuja nimeltรค id.
- Luo funktio nimeltรค printname(). Tรคtรค funktiota ei ole mรครคritetty luokan mรครคritelmรคssรค.
- Luo funktio nimeltรค printid(). Tรคmรค funktio on mรครคritelty luokkamรครคritelmรคssรค. Sen runko on lisรคtty luokkamรครคritelmรครคn.
- Tulosta muuttujan id arvo muun tekstin rinnalle konsoliin. Huomaa, ettรค tรคmรค on lisรคtty printid()-funktion runkoon. Se suoritetaan vain, kun printid()-funktiota kutsutaan.
- Funktion printid() rungon loppu.
- Kurssin rungon loppu Guru99.
- Funktion printname() mรครคrittelyn alku.
- Tulosta muuttujan tutorial_name arvo konsoliin muun tekstin rinnalle. Huomaa, ettรค tรคmรค on lisรคtty printname()-funktion runkoon. Se suoritetaan vain, kun printname()-funktiota kutsutaan.
- Tulostusnimi()-funktion mรครคritelmรคn loppu.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
- Luo luokan instanssi Guru99 ja antoi sille nimen guru99.
- Kรคytรค yllรค olevaa esiintymรครค arvon mรครคrittรคmiseen C++ muuttujaan tutorial_name.
- Kรคytรค guru99-instanssia mรครคrittรครคksesi arvon 1001 muuttujalle id.
- Kรคytรค ilmentymรครค guru99 kutsuaksesi funktiota printname() .
- Soita end (end line) -komento tulostaaksesi uuden tyhjรคn rivin konsoliin.
- Kรคytรค instanssia guru99 kutsuaksesi funktiota printid().
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Main()-funktion rungon loppu.
Kaksi erityistรค jรคsenfunktiota suoritetaan automaattisesti, kun objekti luodaan ja kun se tuhotaan.
Rakentajat ja tuhoajat
Mikรค on rakentaja?
Konstruktorit ovat erikoisfunktioita, jotka alustavat objekteja. C++ kerรครคjiรค kutsu konstruktoria luodessasi objektia. Konstruktorit auttavat arvojen mรครคrittรคmisessรค luokan jรคsenille. Tรคmรค tapahtuu tietenkin sen jรคlkeen, kun heille on varattu muistitilaa.
Mikรค on destruktori?
Destruktorit toisaalta auttavat tuhoamaan luokkaobjekteja.
Rakentajan nimen on oltava samanlainen kuin luokan nimi. Rakentajilla ei ole palautustyyppiรค.
Konstruktori voidaan mรครคrittรครค luokan rungon sisรคllรค tai ulkopuolella. Jos se mรครคritellรครคn luokan rungon ulkopuolella, se tulee mรครคrittรครค luokan nimellรค ja laajuuden resoluutiooperaattorilla (::).
Esimerkki 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; } }
lรคhtรถ:
Tรคssรค on kuvakaappaus koodista:
Code Selitys:
- Sisรคllytรค iostream-otsikkotiedosto koodiin kรคyttรครคksesi sen toimintoja.
- Sisรคllytรค std-nimiavaruus koodiimme kรคyttรครคksesi sen luokkia kutsumatta sitรค.
- Luo luokka nimeltรค ClassA.
- Kรคytรค julkisen kรคyttรถoikeuden muokkaajaa merkitรคksesi jรคsen, jonka olemme luomassa, julkisesti kรคytettรคvรคksi.
- Luo luokalle konstruktori.
- Konsoliin tulostettava teksti, kun konstruktoria kutsutaan. Loppu on a C++ avainsana, joka tarkoittaa loppuriviรค. Se siirtรครค hiiren osoittimen seuraavalle riville.
- Luokkakonstruktorin rungon loppu.
- Luo luokalle tuhoaja.
- Konsoliin tulostettava teksti, kun destructoria kutsutaan. Loppu on a C++ avainsana, joka tarkoittaa loppuriviรค. Se siirtรครค hiiren osoittimen seuraavalle riville.
- Tuhoajan rungon pรครค.
- Luokan rungon loppu.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisรคtรค tรคmรคn funktion runkoon.
- Luo luokkaobjekti ja anna sille nimi a. Rakentaja kutsutaan.
- Luo kokonaislukumuuttuja nimeltรค p ja anna sille arvo 1.
- Luo if-lauselohko kรคyttรคmรคllรค muuttujaa p.
- Luo luokkaobjekti ja anna sille nimi b. Tuhoaja kutsutaan.
- if-lauseen rungon loppu.
- Main()-funktion rungon loppu.








