Programmeerimine keeles C++
Praktikum 2 – klassid ja objektid
Lühike võrdlus Javaga
C++ ja Java on paljuski sarnased keeled, kuid neil on ka erinevusi. Üks olulisemaid erinevusi on see, et C++ programmeerijad vastutavad mäluhalduse eest ja peavad küsitud mälu ise vabastama, samas kui Java sisseehitatud prügikoristus teeb selle töö ise. Samuti on C++ standardteek väiksem kui Java oma ning programmeerija ülesandeks on tihti töö jaoks sobiva teegi leidmine. Java ja C++ võrdlust vaata siit: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B
Klassid
Klassid kirjeldatakse tavaliselt kahes osas. Päises esitatakse klassi deklaratsioon ja cpp-failides klassi meetodite realisatsioonid. Järgneb näidisklass (päise osa).
/*! Näidisklass. */ class KlassiNimi { public: /*! Klassi vaikekonstruktor. */ KlassiNimi (); /*! Klassi parameetritega konstruktor. */ KlassiNimi (bool par1, long par2); /*! Klassi destruktor. */ ~KlassiNimi (); /*! Avalik meetod. */ void meetod (); /*! Avalik isendimuutuja - saab lugeda ka väljaspoolt klassi */ bool avalik_muutuja; private: /*! Varjatud meetod. */ int varjatudMeetod (); /*! Varjatud isendimuutuja. */ long varjatud_muutuja; };
Meetodid ja muutujad
Klassi põhiosa moodustavad tavaliselt meetodid ja muutujad. Mõlematel saab määrata nähtavust:
- avalik (
public
) – on nähtavad ja kasutatavad kõigile, - kaitstud (
protected
) – on nähtavad vaid alamklasside meetoditele, - varjatud (
private
) – on nähtavad ja kasutatavad vaid selle klassi siseselt ningfriend
meetoditele. Vaata lisaks http://www.cplusplus.com/doc/tutorial/inheritance/
Nii meetodeid kui muutujaid saab defineerida isendimeetoditeks (ja -muutujateks), mis on vaikimisi käitumine, kui ka klassimeetoditeks (ja -muutujateks) kasutades selleks static
võtmesõna. Vaata lisaks https://www.tutorialspoint.com/cplusplus/cpp_static_members.htm
Klassis võib olla mitu sama nime ja erinevate parameetritega meetodit (nagu eelnevas näites toodud konstruktor).
Konstruktorid ja destruktorid
Konstruktor on meetod, mis käivitatakse klassist uue objekti loomisel. Konstruktori sees antakse muutujatele algväärtuseid ning tehakse muid ettevalmistusi. Konstruktoreid võib vastavalt vajadustele olla mitu. Parameetritega konstruktori abil saab näiteks objekti loomisel ette anda algväärtuseid. Vaikekonstruktor peab suutma objekti luua ilma etteantud väärtusteta. Lisaks on olemas veel koopiakonstruktor, mille abil saab objekte kopeerida. Kui programmeerija ei kirjuta konstruktoreid, siis vaikekonstruktori ja koopiakonstruktori loob kompilaator ise. Tuleb arvestada, et need ei tarvitse käituda alati nii, nagu programmeerijal vaja.
KlassiNimi objekt1; // objekti loomine, käivitatakse vaikekonstruktor KlassiNimi objekt2 (true, 100000); // kasutame parameetritega konstruktorit KlassiNimi objekt3 (objekt2); // kasutame koopiakonstruktorit KlassiNimi objekt4 {false, 5}; // C++11 universaalne algväärtustamine
Täpsemalt loe: http://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization
Destruktorid on meetodid, mida kutsutakse välja objekti eluea lõpus. Destruktorid vastutavad selle eest, et vabastataks kõik ressursid, mida objekt kasutanud on.
Tehete ülelaadimine
C++ võimaldab defineerida tehteid objektide vahel. On võimalik defineerida tehteid (omistamine, liitmine, korrutamine jne) oma klasside instantside vahel või tehteid oma klassi ja näiteks täisarvude vahel. Üks tehetest, mida on mõistlik üle katta, on omistamine (=), mida kasutatakse klassi objektide omistamisel. Kompilaator jällegi loob mingi esialgse variandi, kuid keerulisemate struktuuride jaoks on võimalik teha enda versioonid. Pane tähele, et võid üle defineerida ka näiteks võrdlemise ja eitamise tehted. Üldiselt soovitatakse seda võimalust siiski ettevaatlikult kasutada, sest ülelaadimist liiga palju kasutades on võimalik koodi segasemaks muuta.
Lisamaterjalid
Pikemalt klasside ja tehete kohta loe siit:
- http://www.cplusplus.com/doc/tutorial/classes.html
- http://www.cplusplus.com/doc/tutorial/classes2.html
- http://www.cplusplus.com/doc/tutorial/operators.html
Teegid
Teek on kogum objektkoodi, mis täidab mingit konkreetset ülesannet ja on ette nähtud taaskasutamiseks. Näiteks võib kirjutada teegi, mis aitab programmeerijal töötada pildifailide, krüpteeritud andmete või keerulise matemaatikaga. Teegiga käib alati kaasas komplekt päiseid, mis kirjeldavad teegis pakutavat. Teeki kasutama hakkav programmeerija lisab oma programmile teegi päised ning kompileerides lisab kompilaatorile ka vastava teegifaili (GCC teegid on a-laiendiga failid, sõnast archive). Teegi puhul on väga oluline korralik dokumentatsioon, mis kirjeldab võimalikult hästi teegi kasutamist ja piiranguid.
Lisalugemist väljundvoogu suunamise tehte ülelaadimise kohta
Vaatame näiteks klassi Point2
väljundvoogu suunamise tehet.
Deklaratsioon päises:
ostream& operator<<(ostream& out, const Point2& p);
Realisatsioon:
ostream& operator<<(ostream& out, const Point2& p) { out << "(" << p.x << ", " << p.y << ")"; return out; }
Siin näete mitut märksõna ja sümbolit, mida me varem kasutanud pole.
NB! Antud hetkel pole tegemist klassi ega isendi funktsiooniga, ehk funktsioon pole deklareeritud klassi sees. Viimast on tarvis teha vaid siis, kui operaator peab saama kasutada privaatseid funktsioone ja/või muutujaid. Sellisel juhul tuleb funktsiooni ette lisada võtmesõna friend
.
Klassi sõbrad (friend)
Niimoodi märgendatud meetodid pääsevad ligi ka klassi privaatsetele muutujatele. Vaata näiteid: http://www.cplusplus.com/doc/tutorial/inheritance/
Viited (ostream&)
Viidetest räägime pikemalt neljandas praktikumis. Praegu teadke, et nii tähistatud andmeid ei kopeerita, vaid antakse edasi viide konkreetsele muutujale.
Täpsemalt loe: http://www.cplusplus.com/doc/tutorial/pointers/
Konstant (const)
Konstantavaldiste muutmist kompilaator ei luba. Konstantavaldise kombineerimine viidetega võimaldab meil kiirelt edastada andmeid ilma neid kopeerimata, samas tagades, et meetod ei muuda neid andmeid. Selles kursuses me konstantavaldistega kahjuks põhjalikult tegeleda ei jõua.
Lisainfot leiad siit: http://www.possibility.com/Cpp/const.html