Olio-ohjelmointi Olioperusteinen ohjelmointi C++-kielellä. 1. Johdanto
|
|
- Hanna-Mari Pääkkönen
- 6 vuotta sitten
- Katselukertoja:
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 Sisältö 1. Johdanto 2. Luokan määrittely ja jäsenten näkyvyys 3. Olion muodostaminen ja tuhoaminen 4. Saanti- ja asetusmetodit
LisätiedotLuokassa 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ätiedoton 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ätiedotOperaattoreiden 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ätiedotT 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ätiedotSisä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ätiedotSisä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ätiedotOlio-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ätiedotLuokan muodostimet (Constructors)
Mikä on muodostin? Luokan muodostimet (Constructors) Millaisia muodostimia on? Oletusmuodostin (Default Constructor) Parametrillinen muodostin Kopiointimuodostin (Copy Constructor) this-muuttuja Miten
Lisätiedot815338A 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ätiedot815338A 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ätiedotKompositio. 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ätiedotJavan 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ätiedotOlion 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ätiedotOliot 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ätiedot4. 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ätiedotA) 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ätiedotSisä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ätiedotMetodit. 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ätiedotSisä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ätiedotOlio-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ätiedotUML 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ätiedot7. 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ätiedotSisä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ätiedot1. 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ätiedot9. 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ätiedot812341A 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ätiedotOsoitin 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ätiedot815338A 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ätiedotJAVA-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ätiedot4. 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ätiedotTaulukot. 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ätiedot2. 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ätiedotOhjelmointitaito (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ätiedotUNIVERSITY 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ätiedotSisä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ätiedotYHTEYSSUHDE (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ätiedotJava-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ätiedot19. 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ätiedot812336A 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ätiedot15. 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ätiedot12 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ätiedotOsa 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ätiedotKooste. 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ätiedotSisä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ätiedotSisä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ätiedot2. 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ätiedotSisä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ätiedotKOHDELUOKAN 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ätiedot9. 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ätiedotMikä 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ätiedot812347A 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ätiedotC++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ätiedotOpintojakso 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ätiedotSisä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ätiedot812347A 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ätiedotTietueet. 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ätiedotSisä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ätiedotOlio-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ätiedotOpintojakso 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ätiedot812347A 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ätiedot1 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ätiedotOlio-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ätiedotPeriytyminen (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ätiedotT740103 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ätiedotOhjelmassa 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ätiedotGeneeriset 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ätiedotITKP102 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ätiedot15. 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ätiedotSisä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ätiedot812347A 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ätiedotAalto 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ätiedotOhjelmointitaito (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ätiedotITKP102 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ätiedotLyhyt 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ätiedot13 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ätiedotSisä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ätiedotYleistä. 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ätiedotLoppukurssin 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ätiedotLoppukurssin 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ätiedotMerkkijono 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ätiedotMetodien 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ätiedotJava-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ätiedotOhjelmoinnin 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ätiedotJava 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ätiedotRajapinnasta 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ätiedotITKP102 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ätiedotOhjelmointi 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ätiedotITKP102 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ätiedotConcurrency - 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ätiedotSisä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ätiedotC++ 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ätiedot11/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ätiedotOpintojakso 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ätiedotLohkot. 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ätiedotSisä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ätiedotP 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ätiedotpublic 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ätiedotPeriytyminen. 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ätiedotOhjelmoinnin 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