Arvutiteaduse instituut
  1. Kursused
  2. 2020/21 kevad
  3. Programmeerimine keeles C++ (MTAT.03.158)
EN
Logi sisse

Programmeerimine keeles C++ 2020/21 kevad

  • Pealeht
  • Praktikumid
    • Lahenduste esitamine
    • Tulemused
  • Eksamiajad
  • Juhendid
  • Viited

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 ning friend 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:

  1. http://www.cplusplus.com/doc/tutorial/classes.html
  2. http://www.cplusplus.com/doc/tutorial/classes2.html
  3. 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

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused