Olio-ohjelmointi Olioperusteinen ohjelmointi C++-kielellä. 1. Johdanto

Koko: px
Aloita esitys sivulta:

Download "Olio-ohjelmointi Olioperusteinen ohjelmointi C++-kielellä. 1. Johdanto"

Transkriptio

1 Olio-ohjelmointi Olioperusteinen ohjelmointi C++-kielellä Tässä osassa käsitellään olioperusteista (object-based) ohjelmointia, ts. olio-ohjelmointia ilman periytymisen hyödyntämistä. Olio-ohjelmoinnin peruskäsitteitä käsitellään myös rinnakkaisella kurssilla Oliosuuntautunut analyysi ja suunnittelu. Tässä keskitytään pääasiassa olioperusteisen ohjelman toteuttamiseen C++ - kielellä. Materiaali pohjautuu enimmäkseen opetusmonisteen [CppTut] lukuun 2 ja kurssin C++-kielen perusteet luentomateriaaliin. Päivi Hietasen kirjassa [Hie] asiaa käsitellään osassa IV. Teoksen [Bud] luvuissa 4-7 perehdytään olioperusteiseen ohjelmointiin yleisesti käyttäen muitakin kieliä esimerkkeinä. 1. Johdanto Olio-ohjelmoinnissa kapseloidaan tiedot ja sitä käsittelevät funktiot yhdeksi kokonaisuudeksi, jota kutsutaan luokaksi. Luokka määrittelee siis tietotyypin. Valmista luokkaa voidaan hyödyntää käyttämällä sen palveluita luokan ilmentymien eli olioiden avulla. Luokan määrittely kertoo, mitä tietojäseniä sen olioilla on. Luokan metodit määrittelevät puolestaan toimenpiteet, joita oliolle voi tehdä. Samasta luokasta voidaan luoda useita olioita samoin kuin perustietotyyppien muuttujia voi ohjelmassa olla monia kerrallaan. Tietojen kätkemisellä eli piilottamisella tarkoitetaan sitä, että luokissa määriteltyjä tietoja voidaan käsitellä ainoastaan kyseisessä luokissa määritellyillä metodeilla. Toteutustavan piilotuksella tarkoitetaan taas sitä, että luokka piilottaa sisälleen palveluidensa toteutustavan metodeina. Luokkaa käyttävä ulkopuolinen koodi näkee palvelun ainoastaan nimitasolla. Luokka erottaa täten palvelun liittymän ja toteutustavan. C++:n oliot ovat muuttujina samanlaisia kuin sisäisten tyyppien muuttuja. Siten olio voi olla eliniältään 1. Automaattinen, jolloin kääntäjä huolehtii sen alustamisesta ja tuhoamisesta ilman ohjelmoijan erillisiä toimenpiteitä. 2. Staattinen, jolloin muuttuja on määrittelyn jälkeen olemassa koko ohjelman suorituksen ajan. 3. (Keko)dynaaminen, jolloin ohjelmoija varaa muuttujan kekomuistista. Tällöin muuttujan tuhoaminen on myös ohjelmoijan vastuulla. Tässä suhteessa C++ poikkeaa Java-kielestä, jossa kaikki oliomuuttujat ovat kekodynaamisia. Javan automaattisen roskienkeruun ansiosta ohjelmoijan ei kuitenkaan tarvitse itse vapauttaa olioiden muistia kuten C++-kielessä. Olemassa olevista luokista voidaan määritellä uusia luokkia koostamalla tai periyttämällä. Tässä osassa ei vielä käsitellä periytymistä. 1

2 2. Luokan määrittely ja jäsenten näkyvyys C++-kielessä luokka määritellään yleisimmin avainsanalla class; myös avainsanat struct ja union määrittelevät luokat, joiden oletusominaisuudet poikkeavat hieman class-avainsanalla määritellystä luokasta. Tässä käytetään aina luokan määrittelyssä avainsanaa class. Luokkamääritys koostuu mainitusta avainsanasta, luokan nimestä ja puolipisteeseen päättyvästä lohkosta, jonka sisällä esitellään luokan attribuutit ja metodit. Luokan määrittely on siis syntaktisesti seuraavan muotoinen: class LuokkaNimi attribuuttien esittely metodien esittely ; // HUOMAA PUOLIPISTE! Yleensä C++-ohjelmassa luokan määrittely on omassa otsikkotiedostossaan; näin on aina oltava, mikäli luokkaa halutaan käyttää useammasta moduulista. Luokan metodit toteutetaan yleensä luokan määrittelystä erillään kooditiedostossa. Luokka muodostaa oman nimiavaruutensa, joten samannimisiä jäseniä voidaan käyttää eri luokissa. Luokan jäsenten näkyvyys C++-kielessä voi olla kolmea tyyppiä: private, protected ja public. Private-tyyppiset jäsenet näkyvät ainoastaan luokan sisällä, protected-tyyppiset luokassa ja sen aliluokissa sekä public-tyyppiset kaikkialla, myös luokan ulkopuolella. Public-tyyppiset jäsenet muodostavat luokan käyttöliittymän, joka hyvän suunnittelutavan mukaisesti tulisi pitää mahdollisimman suppeana. C++:ssa oletusnäkyvyytenä on private, toisin kuin Java-kielessä, jossa oletusnäkyvyys on oma tyyppinsä, ns. pakkausnäkyvyys. Oletetaan, että ohjelmassa tarvittaisiin luokka, jonka oliot kuvaisivat tason pisteitä. Luokkaan on sisällytettävä jäsenmuuttujat pisteen x- ja y-koordinaateille. Nämä määritellään privatetyyppisiksi, jotta niitä ei voi muutella tahattomasti luokan ulkopuolelta. Mikäli luokkaan tarvittaisiin toiminto, joka tulostaa pisteen, se toteutettaisiin luokan julkisena metodina. Tällaisen luokan luokkakaavio olisi seuraavan kaltainen: Kuva. Tason pistettä kuvaavavan luokan luokkakaavio. Seuraavaksi esitetään edellä mainitun luokan C++-kielinen määrittely, joka on sijoitettu otsikkotiedostoon nimeltä piste.h. Luokka sisältää siis kaksi private-tyyppistä attribuuttia sekä yhden julkisen metodin esittelyn. Attribuuttien tietotyyppi on double, jolla esitetään C++kielessä desimaalilukuja. Huomaa myös tiedoston alussa ja lopussa sijaitsevat #-merkillä alkavat esikääntäjän käskyt. Ne muodostavat ns. include-vahdin, joka estää otsikkotiedoston useammankertaisen sisällyttämisen käännösyksikköön. Include-vahtia on syytä käyttää aina otsikkotiedostoissa. 2

3 // Tiedosto piste.h #ifndef PISTE_H_INCLUDED #define PISTE_H_INCLUDED class Piste private: double x_coord; double y_coord; ; public: void tulosta(); #endif Kaikki luokan määrittelyssä esitellyt metodit on toteutettava ja kaikille luokkaan toteutetuille metodeille on löydyttävä esittely luokasta. Luokan määrittely kertoo yleensä ainoastaan sen, mitä palveluita luokan oliot tarjoavat. Metodin määritys kertoo sen sijaan palvelun toteutustavan. Kuten yllä mainittiin, metodit toteutetaan tavallisesti erillään luokan määrittelystä. Luokan metodin syntaksi on seuraava: paluutyyppi LuokkaNimi::metodinNimi(parametrit) metodin runko Huomaa, että metodin määrittelyssä täytyy näkyä metodin sisältävän luokan nimi, koska eri luokissa voi olla samannimisiä metodeja. Alla on toteutettu Piste-luokan (toistaiseksi) ainoa metodi kooditiedostoon piste.cpp. // Tiedosto piste.cpp #include "piste.h" void Piste::tulosta() std::cout << "(" << x_coord << "," << y_coord << ")" << std::endl; Metodia voitaisiin käyttää seuraavasti pääohjelmassa // Tiedosto piste_main.cpp #include "piste.h" int main(int argc, char** argv) Piste p3; // Luodaan Piste-luokan olio p3.tulosta(); // Kutsutaan olion tulosta-metodia return 0; 3

4 Aluksi ohjelmassa luodaan Piste-luokan olio nimeltään p3. Tämän jälkeen kutsutaan olion metodia tulosta, joka tulostaa attribuuttien arvot konsolille. Koska luokan attribuuteille ei kuitenkaan aseteta arvoja missään vaiheessa, tulostettavat arvot ovat satunnaisia ja tulostus voi olla esimerkiksi ( e-307,1.7921e-307). 3. Olion luominen ja tuhoaminen Olioihin voi kohdistua seuraavia automaattisia toimintoja: tilanvaraus, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen. Tilanvarauksessa varataan tietokoneen muistista riittävä tila, jotta olion tietojäsenet voidaan tallentaa muistiin. Olion tyhjennys tarkoittaa sen tietojäsenten tyhjentämistä ja tuhoaminen olion tilanvarauksen purkamista. Termiä tyhjennys käytetään kuitenkin varsin harvoin. Alustuksessa annetaan olion tietojäsenille alkuarvot. Automaattinen toiminto voi aktivoitua järjestelmän käynnistämänä tai ohjelmoijan tarkoituksellisesti käynnistämänä. Muut olioihin kohdistuvat toiminnot liittyvät usein olion tilan eli olion attribuuttien tutkimiseen tai muuttamiseen. Kun olio luodaan, sille varataan muistista tila; olion tilanvaraus- ja tilanvapautushetki riippuu olion eliniän tyypistä. Tämän jälkeen olio alustetaan, mihin liittyvät toimenpiteet tehdään erityisessä tätä tarkoitusta varten kirjoitetussa metodissa, jota kutsutaan muodostimeksi eli konstruktoriksi (constructor). Yleensä muodostimessa annetaan ainakin olion attribuuteille tarkoituksenmukaiset arvot. Luokalla voi olla useita ylikuormitettuja muodostimia eri käyttötilanteita varten. Jokaista oliota luotaessa kutsutaan kerran jotakin luokan muodostinta. Muodostimen tunnistaa ohjelmakoodista seuraavista seikoista: Muodostin on luokan jäsenfunktio, jonka nimi on sama kuin luokan nimi ja jolla ei ole lainkaan paluuarvotyyppiä. Muodostimet voidaan jakaa seuraaviin ryhmiin: oletusmuodostin (default constructor), kopiointimuodostin (copy constructor) sekä ohjelmoijan määrittelemät parametrilliset muodostimet. Oletusmuodostinta voidaan kutsua ilman parametreja: se alustaa olion attribuutit oletusarvoilla. Oletusmuodostin voi olla kääntäjän generoima tai ohjelmoijan kirjoittama metodi. Mikäli ohjelmoija ei toteuta luokkaan lainkaan muodostimia, kääntäjä generoi luokalle oletusmuodostimen. Esimerkiksi edellisen kappaleen Piste-luokkaan ei ollut toteutettu muodostinta, joten Piste-oliota luotaessa kutsuttiin kääntäjän tekemää oletusmuodostinta. C++kääntäjän generoima oletusmuodostin ei tee varsinaisesti mitään. Oletusmuodostinta tarvitaan kuitenkin esimerkiksi luotaessa oliotaulukoita, koska varattaessa taulukolle tila, on varattava sen yksittäisille oliojäsenille tila. Tällöin järjestelmä kutsuu oletusmuodostinta automaattisesti olion tilanvarauksen yhteydessä. Ohjelmoija voi halutessaan määritellä oletusmuodostimen, jossa attribuutit alustetaan sopivilla arvoilla. Luokkaan voidaan määritellä myös parametrillisia muodostimia, jotka ovat aina ohjelmoijan itse luomia. Ylikuormittamalla voidaan samaan luokkaan tehdä useita muodostimia, kunhan niiden parametrilistat vain poikkeavat toisistaan. Kääntäjä ei generoi oletusmuodostinta, jos luokalle on määritelty yksikin parametrillinen muodostin. Tämän voi havaita käytettäessä oliotaulukoita. Oletetaan, että Piste-luokkaan olisi kirjoitettu parametrillinen muodostin, jolloin luokan koodi voisi olla 4

5 // Tiedosto piste.h #ifndef PISTE_H_INCLUDED #define PISTE_H_INCLUDED class Piste private: double x_coord; double y_coord; ; public: Piste(double x,double y); void tulosta(); #endif Muodostimen toteutus lisätään kooditiedostoon piste.cpp : Piste::Piste(double x,double y) x_coord = x; y_coord = y; Nyt pääohjelmaa #include "piste.h" int main(int argc, char** argv) Piste ptaulu[5]; // Oliotaulukko // Taulukon käsittelyä return 0; käännettäessä saadaan seuraavan tyyppinen virheilmoitus: piste_main.cpp: In function 'int main(int, char**)': piste_main.cpp:7:16: error: no matching function for call to 'Piste::Piste()' piste_main.cpp:7:16: note: candidates are: piste.h:11:3: note: Piste::Piste(double, double) piste.h:11:3: note: candidate expects 2 arguments, 0 provided Virheilmoituksen toiselta riviltä käy ilmi, että taulukkoa varattaessa yritetään muodostaa oliot oletusmuodostimen avulla. Tällaista ei kuitenkaan luokassa ole, joten joudutaan virhetilanteeseen. Koodi voidaan saada toimivaksi ilman oletusmuodostinta, jos taulukkoon sijoitetaankin osoittimia kekodynaamisesti luotaviin olioihin. Tällöin kuitenkin ohjelmoijan on itse varattava oliot ja myös tuhottava ne esimerkiksi seuraavasti: 5

6 #include "piste.h" int main(int argc, char** argv) Piste *ptaulu[5]; // Taulukossa osoittimia Piste-olioihin // Luodaan oliot: for(int i=0; i < 5; i++) ptaulu[i] = new Piste(1.0,2.0); // Taulukon käsittelyä // Tuhotaan oliot for(int i=0; i < 5; i++) delete ptaulu[i]; return 0; Java-kielen oliot ovat aina viitetyyppisiä, joten Javan oliotaulukkojen käsittely muistuttaa edellistä esimerkkiä, mutta Java-ohjelmoijan ei tarvitse kantaa huolta olioiden tuhoamisesta kielen automaattisen roskankeruun vuoksi. Muodostimessa suoritettavat attribuuttien alustukset voidaan tehdä myös ns. alustuslistan avulla. Tällöin attribuuttien alustus tapahtuu niiden määrittelyn yhteydessä. Tavallisesti on samantekevää, käyttääkö alustuslistaa vai alustaako attribuutin muodostimen rungossa. Joissakin tapauksissa muodostimen rungossa ei enää voi tehdä alustusta: tällöin on käytettävä alustuslistaa. Yleisin tällainen tapaus on yliluokan alustaminen aliluokan muodostimessa. Tähän tutustutaan tarkemmin periytymisen yhteydessä. Muulloin alustuslistaa on käytettävä, kun alustettava attribuutti on vakio tai viittaustyyppinen. Seuraavassa on Piste-luokkaan lisätty oletusmuodostin. Pisteiden koordinaatit parametreinaan saava parametrillinen muodostin on muutettu käyttämään alustuslistaa, jossa attribuutit alustetaan. // Tiedosto piste.h #ifndef PISTE_H_INCLUDED #define PISTE_H_INCLUDED class Piste private: double x_coord; double y_coord; public: Piste(); Piste(double x,double y); void tulosta(); ; #endif Muodostimien toteutukset kooditiedostossa piste.cpp : 6

7 Piste::Piste() x_coord = 0; y_coord = 0; Piste::Piste(double x,double y):x_coord(x),y_coord(y) Oletusmuodostimessa koordinaattien arvoiksi sijoitetaan nollat muodostimen rungossa. Nyt pääohjelman #include "piste.h" int main(int argc, char** argv) Piste p3; p3.tulosta(); // Käyttää oletusmuodostinta Piste p1(-3.23,4.11); // Käyttää parametrillista muodostinta p1.tulosta(); return 0; tulostus olisi (0,0) (-3.23,4.11) Ensimmäinen tulostuslause tulostaa nyt nollapisteen, koska kääntäjän generoiman oletusmuodostimen tilalle on tullut ohjelmoijan laatima oletusmuodostin, joka alustaa attribuutit nolliksi. Kopiointimuodostin alustaa (yleensä) olion attribuutit saman luokan toisen olion vastaavilla arvoilla. Ohjelmoijan ei useimmiten tarvitse kirjoittaa itse kopiointimuodostinta, koska tällöin kääntäjä generoi kopiointimuodostimen, joka kopioi uudelle oliolle parametrina välitetyn saman luokan olion attribuuttien sisällön. Jos kääntäjän generoima muodostin ei kuitenkaan sovi haluttuun tilanteeseen, ohjelmoija voi itse määritellä kopiointimuodostimen. Kopiointimuodostin on muodollisesti seuraavan kaltainen: Sen ensimmäinen parametri on viittaus saman luokan olioon (yleensä määritelty vakioksi const-määreellä) ja sen mahdollisilla muilla parametreilla tulee olla oletusarvo. Kopiointimuodostimen pari on sijoitusoperaattori. Jos ohjelmoija ei määrittele luokalle sijoitusoperaattoria, kääntäjä luo sellaisen. Kääntäjän luoma sijoitusoperaattori toimii kääntäjän luoman kopiointimuodostimen tapaan: se kopioi lähdeoliosta attribuutit kohdeolioon. Mikäli ohjelmoija kirjoittaa kopiointimuodostimen ja muuttaa sen oletussemantiikkaa, on yleensä myös sijoitusoperaattori kirjoitettava toimimaan vastaavalla tavalla. Sijoitusoperaattori on aina luokan jäsenfunktio ja sen muoto on Luokka& operator=(const Luokka&); 7

8 Alla olevassa esimerkissä on kirjoitettu Piste-luokalle kopiointimuodostin ja sijoitusoperaattori. Huomaa, että tässä tapauksessa noudatetaan oletussemantiikkaa, joten niiden kirjoittaminen ei ole tarpeellista ja ne voitaisiin myös jättää toteuttamatta. // Tiedosto piste.h #ifndef PISTE_H_INCLUDED #define PISTE_H_INCLUDED class Piste private: double x_coord; double y_coord; public: Piste(); Piste(double x,double y); // Kopiointimuodostin Piste(const Piste& p); void tulosta(); // Hajotin ~Piste(); ; // Sijoitusoperaattori: Piste& operator=(const Piste &p); #endif Toteutukset kooditiedostoon piste.cpp : // Kopiointimuodostin Piste::Piste(const Piste& p) x_coord = p.x_coord; y_coord = p.y_coord; // Sijoitusoperaattori Piste& Piste::operator=(const Piste& p) // Tarkistetaan sijoitetaanko itseensä: if(this == &p) return *this; x_coord = p.x_coord; y_coord = p.y_coord; return *this; // Hajotin Piste::~Piste() 8

9 Näitä operaatioita voitaisiin testata pääohjelmassa seuraavasti: #include "piste.h" int main(int argc, char** argv) Piste p3; p3.tulosta(); Piste p1(-3.23,4.11); p1.tulosta(); Piste p2(p3); p2.tulosta(); p2 = p1; p2.tulosta(); return 0; Edellä piste p2 luodaan ensin kopiointimuodostinta käyttäen, jolloin se saa attribuuteikseen pisteen p3 attribuuttien arvot. Sijoituksen jälkeen pisteen p2 attribuuttien arvot muuttuvat samoiksi kuin pisteen p1. Nämä seikat voi havaita ohjelman tulostuksesta. Muiden operaattoreiden toteuttamiseen perehdytään ylikuormittamisen käsittelyn yhteydessä. Joskus on tehtävä ohjelmallisia resurssien vapauttamisia, kun oliota tuhotaan. Nämä toimenpiteet tehdään luokan hajottimessa eli destruktorissa (destructor). Luokan hajotinta kutsutaan automaattisesti, kun olion varaama muistitila vapautetaan. Hajotin on luokan jäsenfunktio, jonka nimi on ~-merkkiä seuraava luokan nimi ja jolla ei ole paluuarvotyyppiä. Luokalla on aina täsmälleen yksi hajotin: ellei ohjelmoija määrittele hajotinta, kääntäjä luo sellaisen. Edellä olevassa Piste-luokan koodissa on hajotin toteutettuna. Koska luokassa ei vaadita erityisiä resurssien vapauttamisia, hajottimen runko on tyhjä. Kuten alussa mainittiin, C++-kielen olio voi olla muiden muuttujien tapaan eliniältään automaattinen eli pinodynaaminen, staattinen tai kekodynaaminen. Automaattiset eli pinodynaamiset oliot ovat tyypillisesti lyhytikäisiä. Ne ovat lohkossa paikallisia ja ovat olemassa tietyn palveluketjun tai metodin suorituksen ajan. Niille varataan automaattisesti muistitila pinomuistista olion määrittelyn yhteydessä ja varattu muisti vapautetaan automaattisesti lohkon loppuessa. Kekodynaamiset oliot ovat yleensä pitkäikäisempiä kuin automaattiset oliot. Niiden vaatima muisti varataan kekomuistista ohjelmoijan käskystä new-operaattoria käyttämällä. Tällaisen olion muisti ei vapaudu automaattisesti C++-kielessä, vaan ohjelmoijan on huolehdittava siitä käyttämällä delete-operaattoria. Operaattori new palauttaa osoittimen, jonka tarkoitetyyppi on luotavan olion luokkatyyppi. Operaattori delete voidaan kohdistaa saatuun osoittimeen seuraavaan tapaan: Piste *p1 = 0; // Määrittelee osoittimen, alustaa nollaksi p1 = new Piste(1.5,2.3); // Osoitin osoittaa dynaamisesti varattuun olioon delete p1; // Tuhoaa varatun olion 9

10 Staattiset oliot ovat olemassa koko sovelluksen suorituksen ajan. Niille varataan muisti ohjelman käynnistyessä ja niiden muisti vapautuu ohjelman loppuessa. Nämä oliot ovat joko globaaleja tai static-määreellä esiteltyjä paikallisia olioita. Jälkimmäisiä tarvitaan, kun funktiossa on oltava muuttuja, joka säilyttää arvonsa kutsujen välillä, mutta ei kuitenkaan haluta tehdä muuttujasta globaalia. Staattiset oliot vapautuvat, kun pääohjelman suoritus loppuu. Niitä ei tarvitse siis dynaamisten olioiden tapaan erikseen vapauttaa. Muutetaan Piste-luokan muodostinta ja hajotinta niin, että ne tulostavat ilmoituksen, kun niitä kutsutaan: Piste::Piste(double x,double y):x_coord(x),y_coord(y) std::cout << "Luodaan piste (" << x_coord << "," << y_coord << ")" << std::endl; Piste::~Piste() std::cout << "Tuhotaan piste (" << x_coord << "," << y_coord << ")" << std::endl; Tutkitaan ohjelman #include "piste.h" void luopisteet() Piste *p1 = new Piste(1,1); Piste p2(2,2); static Piste p3(3,3); int main(int argc, char** argv) std::cout << "Kutsutaan funktiota luopisteet" << std::endl; luopisteet(); std::cout << "Palattiin funktiosta luopisteet" << std::endl; std::cout << "Kutsutaan toisen kerran funktiota luopisteet" << std::endl; luopisteet(); std::cout << "Palattiin toisen kerran funktiosta luopisteet" << std::endl; return 0; käyttäytymistä. Kun ohjelma suoritetaan, tulostuu Kutsutaan funktiota luopisteet Luodaan piste (1,1) Luodaan piste (2,2) Luodaan piste (3,3) Tuhotaan piste (2,2) Palattiin funktiosta luopisteet Kutsutaan toisen kerran funktiota luopisteet Luodaan piste (1,1) Luodaan piste (2,2) Tuhotaan piste (2,2) 10

11 Palattiin toisen kerran funktiosta luopisteet Tuhotaan piste (3,3) Funktiossa luopisteet luodaan kolme Piste-oliota, ensimmäinen kekodynaamisena, toinen automaattisena ja kolmas staattisena muuttujana. Kun funktiota kutsutaan ensimmäisen kerran, luodaan kaikki kolme pistettä, mikä näkyykin tulostuksesta. Kun funktiosta poistutaan, automaattinen muuttuja p2 tuhotaan, joten sen hajotinta kutsutaan funktiosta palattaessa. Tämä näkyy myös tulostuksesta. Sen sijaan kekodynaamisesti ja staattisesti varattavia olioita ei tuhota. Kun funktiota kutsutaan toisen kerran, varataan jälleen kekomuistista olio, johon osoitin p1 osoittaa. Samoin varataan automaattinen olio p2, staattinen olio sen sijaan varattiin jo ensimmäisellä kutsulla; sitä ei enää luoda vaan funktiossa käytettäisiin jo aiemmin varattua oliota. Jälleen funktiosta poistuttaessa tuhotaan automaattinen olio. Lopulta ohjelman päättyessä vapautetaan staattinen olio ja sen hajotinta kutsutaan. Kekodynaamisesti varattuja olioita ei vapauteta missään vaiheessa, joten niiden hajotinta ei kutsuta. Näin ollen ohjelmassa on muistivuoto, sillä varattua muistia ei missään vaiheessa vapauteta. Tämä on luonnollisesti ohjelmointivirhe. Lisäksi aika pahakin sellainen, koska funktiosta palattaessa varattuun muistiin osoittava osoitin menetetään. Näin ollen muistia ei voisikaan pääohjelmassa vapauttaa. Järjestelmä kyllä vapauttaa prosessin muistin prosessin päättyessä, joten varatut oliot eivät tässä tapauksessa jää kummittelemaan ikuisiksi ajoiksi. Ohjelmoijan on kuitenkin aina syytä huolehtia varaamansa kekodynaamisen muistin asianmukaisesta vapauttamisesta. 4. Saanti- ja asetusmetodit Edellisen kappaleen esimerkeissä Piste-olion koordinaatteja ei voi suoraan lukea, koska niiden jäsenmuuttujat ovat private-tyyppisiä. Niiden arvot saadaan näkyville ainoastaan kutsumalla luokan tulostusmetodia. Private-näkyvyyden vuoksi kerran luodun Piste-olion koordinaatteja ei voi myöskään enää muuttaa. Tämän vuoksi koordinaatin arvon lukeminen tai muuttaminen johtaa kääntäjän virheilmoitukseen. Jos esimerkiksi kirjoitettaisiin pääohjelmaksi #include "piste.h" int main(int argc, char** argv) Piste p3; p3.tulosta(); // Käyttää oletusmuodostinta Piste p1(-3.23,4.11); // Käyttää parametrillista muodostinta p1.tulosta(); std::cout << X-koordinaatti on << p1.x_coord << std::endl; // TAI p1.x_coord = 2.1; return 0; niin käännettäessä ohjelmaa saataisiin seuraavan tyyppinen virheilmoitus: In file included from piste_main.cpp:2:0: piste.h: In function 'int main(int, char**)': piste.h:9:10: error: 'double Piste::x_coord' is private double x_coord; ^ piste_main.cpp:13:4: error: within this context p1.x_coord = 2.1; 11

12 Ohjelman saisi kääntymään, jos muuttaisi koordinaattien jäsenmuuttujat Piste-luokkaan julkisiksi (public). Tämä tuntuukin houkuttelevalta ajatukselta, mikäli koordinaattien arvoja joutuu lukemaan tai muuttelemaan ohjelmassa usein. Menettelytapa ei ole kuitenkaan hyvä, koska se sallii helposti myös jäsenmuuttujien tahattoman muuttamisen, mikä johtaa herkästi ohjelmointivirheisiin. Tämän takia public-tyyppisiä jäsenmuuttujia käytetään ainoastaan harvinaisissa erikoistapauksissa ja hyvään ohjelmointitapaan kuuluu jäsenmuuttujien määritteleminen private-tyyppisiksi. Tällöin kirjoitetaan tarvittaville jäsenmuuttujille erityiset saanti- ja asetusmetodit. Saantimetodi palauttaa jäsenmuuttujan arvon ja asetusmetodi asettaa muuttujalle uuden arvon. Näin voidaan kontrolloida 1. että jäsenmuuttujan arvoa ei muuteta tahattomasti ja 2. että jäsenmuuttuja saa vain sallittuja arvoja. Esimerkin Piste-luokalle voitaisiin saanti- ja asetusmetodit toteuttaa vaikkapa seuraavasti. Tiedostoon piste.h lisättäisiin metodien prototyypit: public: void setx(double xval); void sety(double yval); double getx(); double gety(); Metodien toteutukset kirjoitettaisiin kooditiedostoon piste.cpp : void Piste::setX(double xval) x_coord = xval; void Piste::setY(double yval) y_coord = yval; double Piste::getX() return x_coord; double Piste::getY()T return y_coord; Tällöin, olettaen, että luokassa on oletusmuodostin joka alustaa koordinaatit nolliksi, pääohjelma #include "piste.h" int main(int argc, char** argv) Piste p; std::cout << "X = " << p.getx() << " Y = " << p.gety() << std::endl; p.setx(8.32); p.sety(-6.45); p.tulosta(); return 0; 12

13 tulostaisi X = 0 Y = 0 (8.32,-6.45) Nyt luokka on käyttökelpoisempi, koska koordinaattien arvoja voidaan ohjelmallisesti muuttaa. Samoin koordinaattien arvot saadaan lukuina, jolloin niillä voidaan operoida. Saanti- ja asetusmetodeja ei kannata kuitenkaan kirjoittaa rutiininomaisesti kaikille jäsenmuuttujille, vaan tarkoituksenmukaisesti ohjelman toiminnan kannalta. Mikäli luokan ulkopuolelta ei esimerkiksi koskaan muuteta jäsenmuuttujan arvoa, ei ole syytä kirjoittaa asetusmetodia. Myöskään saantimetodia ei tarvita, jos luokan ulkopuolella ei tarvitse tietää jäsenmuuttujan arvoa. Huomaa edellisen esimerkin metodien nimeäminen: usein saantimetodin nimeksi annetaan getmuuttujanimi, kun attribuutin nimi on muuttujanimi. Vastaavasti asetusmetodin nimeksi kirjoitetaan setmuuttujanimi. Tällä kurssilla käytetään tavallisesti tällaista nimeämismenetelmää. Semantiikaltaan epätavalliset luokan jäsenet Luokkaan voi jäseniksi määritellä myös tavallisesta toiminnasta poikkeavasti käyttäytyviä jäseniä. Ehkä tavallisimpia ovat vakiomuotoiset metodit. Nämä ovat metodeja, joilla ei ole oikeutta muuttaa olion tilaa. Yleensä ainakin attribuuttien arvot palauttavat metodit on syytä määritellä vakiometodeiksi; vakiometodien käyttö lisää turvallisuutta, koska niissä ei voi tahattomasti muuttaa olion attribuutteja. Jos olio on määritelty vakioksi, ainoastaan sen vakiomuotoisia metodeja voi kutsua. Metodi määritellään vakiometodiksi lisäämällä sen esittelyn loppuun avainsana const. Tämä määrittely kuuluu myös metodin tyyppiin, joten luokkaan on mahdollista (joskaan ei yleensä suositeltavaa) tehdä metodit, joiden tyypit eroavat ainoastaan tässä suhteessa. Edellä käsitellyssä Piste-luokassa metodi tulosta ei saisi muuttaa olion tilaa, joten se kannattaisi määritellä vakiomuotoiseksi: // Tiedosto piste.h #ifndef PISTE_H_INCLUDED #define PISTE_H_INCLUDED class Piste private: double x_coord; double y_coord; public: Piste(); Piste(double x,double y); // Kopiointimuodostin Piste(const Piste& p); void tulosta() const; // Hajotin ~Piste(); ; // Sijoitusoperaattori: Piste& operator=(const Piste &p); #endif 13

14 Myös kooditiedostossa olevaan toteutukseen on lisättävä const-avainsana: void Piste::tulosta() const std::cout << "(" << x_coord << "," << y_coord << ")" << std::endl; Luokka voi myös sisältää vakiomuotoisia attribuutteja. Niitä ei voi enää määrittelyn jälkeen muuttaa ja ne on alustettava muodostimen alustuslistassa. Nämä attribuutit merkitään avainsanalla const. Luokkakohtaiset jäsenet liittyvät koko luokkaan eivätkä yksittäiseen olioon. Tällaiset jäsenet voivat olla joko attribuutteja tai metodeja. Luokkakohtaiset attribuutit sisältävät luokkaa kuvailevia tietoja, jotka ovat kaikkien luokan olioiden käytettävissä luokan metodeissa. Luokkakohtainen tieto on luokan sisällä luonteeltaan globaalia ja luokkakohtaiset attribuutit käyttäytyvät semanttisesti kuten funktion staattiset muuttujat. Myös niiden muistinvaraus tapahtuu staattisesti, ts. järjestelmä varaa luokkakohtaisille attribuuteille tilan samaan aikaan globaalien muuttujien tilanvarauksen kanssa. Staattiset tiedot ovat käytettävissä riippumatta olioiden eliniästä ja vaikka luokasta ei olisi luotu lainkaan olioita. Luokkakohtaisten tietojen käsittely tapahtuu pääasiassa luokkametodeissa, jotka määritellään sellaisiksi static-määreellä. Näitä metodeja voidaan käyttää, vaikka luokan olioita ei ole saatavilla. Toisaalta static-metodeissa ei luonnollisesti voikaan käsitellä muita kuin luokkaattribuutteja. Luokkakohtaisten attribuuttien ja metodien esittely on seuraavaa muotoa. // Tiedosto lampotila.h #ifndef LAMPOTILA_H_INCLUDED #define LAMPOTILA_H_INCLUDED class Lampotila private: double asteet; static double ABS_NOLLA; public: Lampotila(double x); double getasteet() const; static double getabsnolla(); ; #endif Edellä on Lampotila-luokkaan määritelty yhden tavallisen oliokohtaisen attribuutin lisäksi luokkakohtainen attribuutti ABS_NOLLA, joka antaa absoluuttisen nollapisteen lämpötilan Celsius-asteina. Koska attribuutti on yksityinen, sitä ei voi lukea luokan ulkopuolelta, minkä vuoksi on esitelty myös luokkakohtainen metodi getabsnolla(). Luokkakohtaista attribuuttia ei saa alustaa luokan määrittelyssä, joten se on tehtävä kooditiedostossa, jossa ovat myös luokan metodien toteutukset: 14

15 #include "lampotila.h" double Lampotila::ABS_NOLLA = ; Lampotila::Lampotila(double x):asteet(x) double Lampotila::getAsteet() const return asteet; double Lampotila::getAbsNolla() return ABS_NOLLA; Huomaa, miten luokkakohtainen muuttuja alustetaan. Luokkakohtaista metodia voidaan kutsua suoraan luokan nimen avulla, riippumatta olioista. Tosin myös olion kautta tehtävä kutsu on mahdollinen. Seuraavassa on esimerkki kummastakin kutsutavasta: #include "lampotila.h" int main(int argc, char** argv) std::cout << "Absoluuttinen nollapiste = " << Lampotila::getAbsNolla() << std::endl; Lampotila lt(23.25); std::cout << "Olion lampotila on " << lt.getasteet() << std::endl; std::cout << "Absoluuttinen nollapiste = " << lt.getabsnolla() << std::endl; return 0; Koska absoluuttinen nollapiste on muuttumaton (ainakin nykyfysiikan käsitysten mukaan), edellä käytettyä muuttujaa ei olisi syytä muuttaa edes luokan sisällä, joten se voitaisiin määritellä vakioksi. Tällöin koodi muuttuisi seuraavan kaltaiseksi // lampotila.h class Lampotila private: double asteet; const static double ABS_NOLLA; // kooditiedosto const double Lampotila::ABS_NOLLA = ; 15

16 5. Koosteoliot Luokan attribuuttina voi olla myös toisen tai saman luokan olio. Tällöin olioiden välillä vallitsee koostumussuhde. Toisen olion sisältävää oliota sanotaan koosteolioksi, kun toiseen olioon sisältyvä olio on osaolio. Mikäli osaolio ei voi olla olemassa koosteoliosta riippumatta, on kysymyksessä aito kooste (kompositio); tällöin koosteolio omistaa osaolion ja on vastuussa sen käsittelystä. Vaikka koosteolio omistaakin osaolion, se voi käyttää ainoastaan osaolionsa julkista rajapintaa, ellei turvauduta erikoisjärjestelyihin. C++-kielessä on nimittäin ns. ystävämekanismi, jonka avulla luokalle voi antaa pääsyn toisen luokan yksityisiin jäseniin. Tämän mekanismin käyttäminen johtaa kuitenkin helposti huonoihin ohjelmointikäytäntöihin, koska se rikkoo tietojen kätkemisen periaatteen. Siksi mekanismia ei käsitellä tässä. Oletetaan, että on toteutettu henkilöä kuvaava luokka Henkilo: // Tiedosto Henkilo.h #ifndef HENKILO_H_INCLUDED #define HENKILO_H_INCLUDED #include <string> class Henkilo private: std::string etunimi; std::string sukunimi; std::string sotu; public: Henkilo(std::string en,std::string sn,std::string stu); ~Henkilo(); ; std::string getetunimi() const; std::string getsukunimi() const; std::string getsotu() const; #endif // Tiedosto Henkilo.cpp #include <string> #include "henkilo.h" Henkilo::Henkilo(std::string en,std::string sn,std::string stu): etunimi(en),sukunimi(sn),sotu(stu) std::string Henkilo::getEtunimi() const return etunimi; std::string Henkilo::getSukunimi() const return sukunimi; std::string Henkilo::getSotu() const return sotu; 16

17 Tätä luokkaa voitaisiin käyttää esimerkiksi kirjaa kuvaavan luokan tekijää mallintavana osaoliona seuraavan kaavion esittämällä tavalla: Kuva. Kaavio koostamisesta. Ohjelmassa kooste voitaisiin toteuttaa seuraavasti: // Tiedosto Kirja.h #ifndef KIRJA_H_INCLUDED #define KIRJA_H_INCLUDED #include "henkilo.h" class Kirja private: std::string nimi; Henkilo tekija; std::string isbn; ; #endif public: void print(std::ostream &os) const; Kirja(std::string n,const Henkilo &h,std::string isb); ~Kirja(); // Tiedosto Kirja.cpp #include <string> #include "henkilo.h" #include "kirja.h" Kirja::Kirja(std::string n,const Henkilo &h,std::string isb): nimi(n),tekija(h),isbn(isb) void Kirja::print(std::ostream &os) const os << tekija.getetunimi() << " " << tekija.getsukunimi() <<":"<< std::endl; os << nimi << std::endl; os << "ISBN: " << isbn; 17

18 Edellisessä esimerkissä Henkilo-luokan olio on Kirja-luokan muuttujatyyppinen attribuutti. Tällaisessa tapauksessa koosteolion ja osaolion eliniät ovat väistämättä yhtä pitkät. Osaolio luodaan samalla kuin koosteoliokin ja tuhotaan myös samanaikaisesti. Huomaa, että Kirja-luokan muodostimen alustuslistassa alustetaan osaolio tekija Henkilo-luokan kopiointimuodostinta käyttäen. Koosteolion hajottimessa ei muuttujatyyppisen attribuutin tapauksessa yleensä jouduta tekemään erityisiä operaatioita, koska osaolion hajotinta kutsutaan automaattisesti koosteolion tuhoutuessa. Luokkaan on toteutettu muodostimen ja hajottimen lisäksi ainoastaan yksi metodi, joka tulostaa olion tiedot. Huomaa, että kirjan tekijän tietoja tulostettaessa on käytettävä Henkilo-luokan attribuuttien saantimetodeja, koska Kirja-luokassa ei ole suoraa pääsyä ko. attribuutteihin. Osaolio voi olla myös dynaaminen, jolloin luokan attribuutti on osoitintyyppinen ja se laitetaan osoittamaan kekodynaamisesti luotuun olioon. Tällöin olioiden eliniät eivät automaattisesti olekaan yhtä pitkät, vaan osaolio voi jäädä olemaan koosteolion jo tuhouduttua. Tällä mekanismilla voidaan toteuttaa myös olioiden välinen löyhä sidos ja sama olio voi olla monen koosteolion osana. Tällaisessa tapauksessa on huolehdittava tarkasti resurssien vapauttamisesta: osaoliota ei saa tuhota ennenkuin viimeinenkin sen sisältävistä koosteolioista on lakannut tarvitsemasta sen palveluita. Seuraavassa esimerkissä Kurssi-luokalla on kurssin opettajaa kuvaava dynaaminen Henkiloluokan osaolio, jolloin luokan attribuutti on osoitin Henkilo-luokkaan. // Tiedosto Kurssi.h #ifndef KURSSI_H_INCLUDED #define KURSSI_H_INCLUDED #include "henkilo.h" class Kurssi private: std::string nimi; Henkilo* popettaja; int pisteet; ; #endif public: void print(std::ostream &os) const; Kurssi(std::string n,const Henkilo &ope,int credits); Kurssi(const Kurssi &k); Kurssi& operator=(const Kurssi& k); ~Kurssi(); 18

19 // Tiedosto Kurssi.cpp #include <string> #include "henkilo.h" #include "kurssi.h" Kurssi::Kurssi(std::string n,const Henkilo &ope,int credits): nimi(n),pisteet(credits) popettaja = new Henkilo(ope); Kurssi::Kurssi(const Kurssi &k) nimi = k.nimi; pisteet = k.pisteet; if(k.popettaja!= 0) popettaja = new Henkilo(*(k.pOpettaja)); else popettaja = 0; Kurssi::~Kurssi() if (popettaja!= 0) delete popettaja; Kurssi& Kurssi::operator=(const Kurssi& k) if (this == &k) return *this; nimi = k.nimi; pisteet = k.pisteet; if(popettaja!= 0) delete popettaja; if(k.popettaja!= 0) popettaja = new Henkilo(*(k.pOpettaja)); else popettaja = 0; return *this; void Kurssi::print(std::ostream &os) const os << popettaja->getetunimi() << " " << popettaja->getsukunimi() <<":"<< std::endl; os << nimi << " ECTS: " << pisteet; Tulostusmetodin toteuttaminen ei juuri poikkea aiemmasta. Muussa toteutuksessa on selviä eroja. Muodostimessa varataan olio kekodynaamisesti ja alustetaan se parametrioliolla. Hajottimessa on erikseen vapautettava osaolion muisti, koska kekodynaamista muistia ei 19

20 automaattisesti vapauteta. Myös kopiointimuodostin ja sijoitusoperaattori on toteutettava. Mikäli näin ei tehdä, kopioitavan Kurssiolion opettajaolioon kohdistuva osoitin kopioituu uuden Kurssiolion opettajaolion osoittimen arvoksi. Kun ensimmäinen olio tuhotaan, sen opettajaolion muisti vapautetaan. Mutta nyt kopion osoitin jää osoittamaan vapautettuun muistiin ja kopioolion käyttäminen voi johtaa hankaliin virhetilanteisiin ohjelmassa. Sama päättely koskee sijoitusoperaattoria. Näin ollen sekä kopiointimuodostimessa että sijoitusoperaattorissa on varattava kekodynaamisesti muisti osaoliolle. Sijoitusoperaattorissa on lisäksi vapautettava aiemman osaolion varaama muisti. Lähteet [Bud] Budd, Timothy A: An Introduction to Object-Oriented Programming, Addison-Wesley 2002 [CppTut] Juustila, A. Kettunen, H. Kilpi, T. Räisänen, T. Vesanen A.: C++ -tutoriaali (Opetusmoniste) 2004, Saatavana [Hie] Hietanen, P.: C++ ja olio-ohjelmointi, 3. laitos, Docendo

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. III Olioperusteinen ohjelmointi C++:lla

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. III Olioperusteinen ohjelmointi C++:lla 812347A Olio-ohjelmointi, 2015 syksy 2. vsk III Olioperusteinen ohjelmointi C++:lla Sisältö 1. Johdanto 2. Luokan määrittely ja jäsenten näkyvyys 3. Olion muodostaminen ja tuhoaminen 4. Saanti- ja asetusmetodit

Lisätiedot

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: 1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef

Lisätiedot

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 11. Luokka Opetellaan seuraavaksi, miten omia luokkia kirjoitetaan. Aikaisemmin olikin jo esillä, että luokka on tietorakenne, joka sisältää sekä tiedot (attribuutit) että niitä käsittelevät aliohjelmat

Lisätiedot

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Luokan muodostimet (Constructors)

Luokan muodostimet (Constructors) Mikä on muodostin? Luokan muodostimet (Constructors) Millaisia muodostimia on? Oletusmuodostin (Default Constructor) Parametrillinen muodostin Kopiointimuodostin (Copy Constructor) this-muuttuja Miten

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Kompositio Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä kompositio on? Tili - : String - : double 1 1 Kayttoraja

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Oliot viestivät metodeja kutsuen

Oliot viestivät metodeja kutsuen 6. Metodit 6.1 Sisällys Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit). Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen

Lisätiedot

4. Luokan testaus ja käyttö olion kautta 4.1

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) 1(37) PERIYTYMINEN (inheritance) YLILUOKKA (superclass) ALILUOKKA (subclass) A) on käytännöllinen ohjelmointitekniikka = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) B) on käsitteiden

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä

Lisätiedot

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

Lisätiedot

UML ja luokkien väliset suhteet

UML ja luokkien väliset suhteet UML ja luokkien väliset suhteet -Luokan kuvaaminen UML-tekniikalla -Yhteyssuhde ja koostumussuhde 1 Luokan kuvaaminen UML-tekniikalla : Luokka - attribuutti1 : tietotyyppi # attribuutti2 : tietotyyppi

Lisätiedot

7. Oliot ja viitteet 7.1

7. Oliot ja viitteet 7.1 7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 V Abstraktit tietotyypit ja olioohjelmointi Sisältö I. Abstraktit tietotyypit II. 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

4. Olio-ohjelmoinista lyhyesti 4.1

4. Olio-ohjelmoinista lyhyesti 4.1 4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE 1 UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE OPETUSMONISTEET SARJA C11 JUUSTILA ANTTI KETTUNEN HARRI KILPI TEEMU RÄISÄNEN TONI VESANEN ARI C++- OHJELMOINTIKURSSIN OHEISMATERIAALI ISBN

Lisätiedot

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

Lisätiedot

YHTEYSSUHDE (assosiation)

YHTEYSSUHDE (assosiation) YHTEYSSUHDE (assosiation) -Mikä on yhteyssuhde? -Miten toteutan yhteyssuhteen? 1 Mikä on yhteyssuhde? Yhteyssuhde kuvaa kahden olion välistä suhdetta: Esim. Auto Henkilö, omistussuhde Tili Asiakas, omistussuhde

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

19. Olio-ohjelmointia Javalla 19.1

19. Olio-ohjelmointia Javalla 19.1 19. Olio-ohjelmointia Javalla 19.1 Sisällys Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

Lisätiedot

812336A C++ -kielen perusteet, 21.8.2010

812336A C++ -kielen perusteet, 21.8.2010 812336A C++ -kielen perusteet, 21.8.2010 1. Vastaa lyhyesti seuraaviin kysymyksiin (1p kaikista): a) Mitä tarkoittaa funktion ylikuormittaminen (overloading)? b) Mitä tarkoittaa jäsenfunktion ylimääritys

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

12 Mallit (Templates)

12 Mallit (Templates) 12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista

Lisätiedot

Osa III. Olioiden luominen vapaalle muistialueelle

Osa III. Olioiden luominen vapaalle muistialueelle Osa III 10. oppitunti Kehittyneet osoittimet Eräs tehokkaimpia C++ -työkaluja on mahdollisuus käsitellä tietokoneen muistia suoraan osoittimien avulla. Tässä luvussa käsitelläänkin seuraavia aiheita: Kuinka

Lisätiedot

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi. 17. Kooste 17.1 Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa A on B:n osa tai A kuuluu B:hen. Koostesuhteessa olevat luokat eivät yleensä ole periytymissuhteessa. Kooste

Lisätiedot

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.

Lisätiedot

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance) Sisällys JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys Periytyminen (inheritance) Näkyvyys (visibility) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E. Hyvönen: Java Osa

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

KOHDELUOKAN MÄÄRITTELY

KOHDELUOKAN MÄÄRITTELY KOHDELUOKAN MÄÄRITTELY Kohdeluokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Taulukon alkiona

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

Mikä yhteyssuhde on?

Mikä yhteyssuhde on? 1 Yhteyssuhde Mikä yhteyssuhde on? Yhteyssuhde Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä yhteyssuhde on? Tili - : String - : double * 1 Asiakas - hetu: String - : String

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä 812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus

Lisätiedot

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi 1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen.

Lisätiedot

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton 2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

Lisätiedot

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia. 4. Periytyminen 4.1. Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Opintojakso TT00AA11 Ohjelmoinnin jatko (Java) Tavoite Opiskelija ymmärtää olio-ohjelmoinnin problematiikan. Opiskelija osaa määritellä ja käyttää itse

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus 812347A Olio-ohjelmointi, 2015 syksy 2. vsk IV Periytyminen ja monimuotoisuus Sisältö 1. Periytyminen 2. Johdanto monimuotoisuuteen 3. Ylikuormittaminen 4. Uudelleenmäärittely 5. Muuttujien monimuotoisuus

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja) Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Tässä osassa tutustutaan yhteen rakennemalliin (Proxy) ja kolmeen luontimalliin (Factory Method, ) teoksen [Gam] pohjalta.

Lisätiedot

Periytyminen (inheritance)

Periytyminen (inheritance) 1 Periytyminen (inheritance) Mitä periytyminen on? Yli- ja aliluokka Konstruktorit Get- ja set-metodi Muut metodit tostring Yksinkertainen pääohjelma 1 Mitä periytyminen on? Periytymisen avulla olemassa

Lisätiedot

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö. Geneeriset luokat C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet Geneerinen luokka tarkoittaa parametroitua luokkamallia, jonka avulla voidaan muodostaa useita,

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite 2015 syksy 2. vsk VII Suunnittelumallit Adapter ja Composite Sisältö 1. Johdanto rakennemalleihin 2. Adapter (Sovitin) 3. Composite (Rekursiokooste) Suunnittelumallit Adapter ja Composite 2 VII.1 Johdanto

Lisätiedot

Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Lyhyt kertaus osoittimista

Lyhyt kertaus osoittimista , syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin

Lisätiedot

13 Operaattoreiden ylimäärittelyjä

13 Operaattoreiden ylimäärittelyjä 248 13 C++-kielessä voidaan operaattoreita ylimäärittää. Ylimääriteltävää operaattoria voidaan pitää ikäänkuin metodina, joka esitellään luokan esittelyssä ja määritellään luokan ulkopuolella kuten metoditkin.

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt C:n edistyneet piirteet C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura

Lisätiedot

Loppukurssin järjestelyt

Loppukurssin järjestelyt C! Loppukurssin järjestelyt 29.3.2018 Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista? Aikatauluista 10. kierroksen

Lisätiedot

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

Lisätiedot

Metodien tekeminen Javalla

Metodien tekeminen Javalla 1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. 11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

Lisätiedot

Sisällys. 15. Lohkot. Lohkot. Lohkot

Sisällys. 15. Lohkot. Lohkot. Lohkot Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet

Lisätiedot

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout: C++ rautaisannos Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout: # include #include main ( ) main (

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi

Lisätiedot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3 15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet

Lisätiedot

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. 11. Rajapinnat. Johdanto. Johdanto Sisällys 11. ajapinnat. bstrakti luokka vai rajapinta? ajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla.

Lisätiedot

P e d a c o d e ohjelmointikoulutus verkossa

P e d a c o d e ohjelmointikoulutus verkossa P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN

Lisätiedot

public static void main (String [] args)

public static void main (String [] args) HAAGA-HELIA OHJELMOINTI 1(5) OHJELMALUOKKA Ohjelma-luokan käynnistää public static void main (String [] args) main-metodiin voi koodata 1. ohjelman logiikan tai 2. luoda ohjelma-olion ja kutsua metodia,

Lisätiedot

Periytyminen. Luokat ja olio-ohjelmointi

Periytyminen. Luokat ja olio-ohjelmointi Periytyminen 15 Periytyminen Tässä luvussa käsittelemme aihetta, joka on olio-ohjelmoinnin kaikkein tärkein osa - periytyvyys. Periytyvyyden avulla voimme luoda uusia luokkia uudelleenkäyttämällä ja laajentamalla

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot