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



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

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

Olio-ohjelmointi Syntaksikokoelma

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

Luokan muodostimet (Constructors)

12 Mallit (Templates)

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

UML ja luokkien väliset suhteet

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

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

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

Osoitin ja viittaus C++:ssa

Osa III. Olioiden luominen vapaalle muistialueelle

Olio-ohjelmointi Javalla

13 Operaattoreiden ylimäärittelyjä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Olio-ohjelmointi 2. välikoe HYV5SN

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

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

812336A C++ -kielen perusteet,

14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen

1. Olio-ohjelmointi 1.1

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

YHTEYSSUHDE (assosiation)

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE

Luokan sisällä on lista

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

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Kääntäjän virheilmoituksia

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

Periytyminen (inheritance)

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

Mikä yhteyssuhde on?

Luokat. Luokat ja olio-ohjelmointi

2. Olio-ohjelmoinista lyhyesti 2.1

Virtuaalifunktiot ja polymorfismi

Osa III. Edelliset kolme lukua ovat käsitelleet viittausten ja osoittimien käyttöä. Tämän luvun aiheita ovat:

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

Osa. Johdanto C++ - kieleen. Oppitunnit 6 Perusluokat 7 Lisää luokista 8 Kehittynyt ohjelman kulku

Ohjelman virheet ja poikkeusten käsittely

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

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

ITKP102 Ohjelmointi 1 (6 op)

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

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

Periytyminen. Luokat ja olio-ohjelmointi

Ohjelmointi 1 Taulukot ja merkkijonot

Rajapinta (interface)

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

Operaattoreiden uudelleenmäärittely

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

Oliot viestivät metodeja kutsuen

1. Mitä tehdään ensiksi?

public static void main (String [] args)

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

815338A Ohjelmointikielten periaatteet

4. Olio-ohjelmoinista lyhyesti 4.1

1. Omat operaatiot 1.1

Osa. Mitä ovat vakiot jäsenfunktiot Kuinka erotetaan luokan käyttöliittymä sen toteutuksesta

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Apuja ohjelmointiin» Yleisiä virheitä

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

815338A Ohjelmointikielten periaatteet

C# olio-ohjelmointi perusopas

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

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

Osa IV. Oliokeskeinen ohjelmointi

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

15. oppitunti. Taulukot. Osa. Mikä on taulukko?

Muuttujien roolit Kiintoarvo cin >> r;

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Metodien tekeminen Javalla

Merkkijonot ja C++ Antti-Juhani Kaijanaho. 5. maaliskuuta Vanhojen C++-kääntäjien käyttäjät, huomio! 2 Merkkijonojen perusteet

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

Vahva koostumussuhde (Composition)

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

ITKP102 Ohjelmointi 1 (6 op)

19. Olio-ohjelmointia Javalla 19.1

Taulukot. Jukka Harju, Jukka Juslin

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Jypelin käyttöohjeet» Ruutukentän luominen

Ohjelmointi 2, välikoe

9. Periytyminen Javassa 9.1

Luokat ja oliot. Ville Sundberg

Javan perusteita. Janne Käki

Osa. Erikoisaiheet. Oppitunnit 20 Erikoisluokat ja -funktiot 21 Esikäsittelijä

Osa. Mikä on linkitetty lista Kuinka linkitetty lista luodaan Kuinka toiminnallisuus kapseloidaan periytymisen kautta

Mallit standardi mallikirjasto parametroitu tyyppi

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Transkriptio:

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 (palvelut) yhdessä kokonaisuudessa. Luokan määrittely: class class_name access_specifier_1: member1; access_specifier_2: member2;... object_names; Luokan määrittely alkaa avainsanalla class. Sen jälkeen tulee luokan nimi ennen aaltosulkua. Luokan sisällä määritellään luokan jäsenet (joko tieto- tai aliohjelmajäseniä). Jokaiseen jäseneen liittyy suojausmääre (access_specifier) private, protected tai public, joka kertoo, miten jäsen näkyy luokan ulkopuolelle. private: vain luokan jäsenillä ja ystävillä (friend) on oikeus käsitellä jäseniä protected: edellisten lisäksi luokasta periytyvillä johdetuilla luokilla on oikeus käsitellä jäseniä kaikilla näkyvyysalueella olevilla olioilla ja funktioilla on oikeus käsitellä luokan jäseniä. Private-määre on oletus. Luokan määrityksen loppuun voidaan lisät halutun nimisiä olioita 1

(object_names),mutta sitä ei ole pakko tehdä tässä kohdassa. Esimerkki: Tässä luodaan suorakulmio-luokka CRectangle, jossa on kaksi yksityistä tietojäsentä x ja y (sivun pituudet), sekä kaksi julkista jäsenfunktiota set_values ja area. Lopuksi luodaan tätä luokkatyyppiä oleva olio nimeltä rect. class CRectangle int x, y; void set_values (int,int); int area (void); rect; HUOM! On tärkeää erottaa toisistaan luokan nimi (CRectangle) ja olion nimi (rect). Luokan nimi vastaa perinteisen ohjelman tietotyyppiä (esim. int) ja olion nimi muuttujaa (esim. x). Oliot kommunikoivat luokan funktiojäsenien kanssa lähettämällä viestejä, jotka vastaavat aliohjelman kutsuja. Esimerkiksi rect.set_values (3,4); myarea = rect.area(); Edellinen rivi asettaa suorakulmion muuttujien x ja y arvoiksi 3 ja 4. Jälkimmäinen laskee suorakulmion pinta-alan ja sijoittaa tuloksen muuttujaa myarea. Tietojäseniin x ja y ei voi viitata suoraan pääohjelmasta tai muusta aliohjelmasta, koska ne ovat yksityisiä. Ainoastaan luokan julkisilla funktiojäsenillä set_values ja area on oikeus siihen. Seuraavassa on esitetty koko toimiva ohjelma. 2

// classes example #include <iostream> using namespace std; class CRectangle int x, y; void set_values (int,int); int area () return (x*y); ; void CRectangle::set_values (int a, int b) x = a; y = b; int main () CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); return 0; Tässä on luokan funktiojäsenet toteutettu kahdella tavalla. Funktiosta set_values esitetään luokassa ainoastaan prototyyppi eli palvelu. Varsinainen runko-osa eli metodi on esitetty luokan ulkopuolella. Funktio area on kokonaisuudessaan toteutettu luokan sisällä. Molemmat tavat ovat yhtä oikein ; on makuasia kumpaa tapaa haluaa käyttää. Luokan sisällä määritelty funktio on automaattisesti ns. inline-funktio. Menemättä tässä yhteydessä kovin syvälle C++-kääntäjien sielunelämään, riittänee tietää, että inlineksi määritelty funktio saattaa joissakin tapauksissa olla nopeampi suorittaa kuin ei-inline funktio. Suositus on, että ainostaan muutaman rivin mittainen funktio kannattaa koodata inline-funktioksi. Pidemmät inline-funktiot tekevät luokasta helposti vaikealukuisen ja suoritettavan exe-tiedoston koko kasvaa turhan suureksi. Symboli :: on ns. luokkaresoluutio-operaattori. Sitä tarvitaan luokan ulkopuolisen metodin edessä kertomaan, mihin luokkaan kyseinen metodi kuuluu. Esimerkiksi meillä voi olla useita luokkia, joissa on käytössä set_values-niminen metodi, jotka toimivat eri lailla. Silloin täytyy olla joku keino määrittää, minkä luokan set_values-metodista on kysymys. 3

Monesti on välttämätöntä alustaa luokan tietojäsenet johonkin alkuarvoon. Tämä voidaan tehdä muodostimen (constructor) avulla. Muodostimia on kolmenlaisia: Oletusmuodostin alustaa olion automaattisesti johonkin alkuarvoon, ellei sitä erikseen alusteta parametrillisella tai kopiointimuodostimella. Parametrillinen muodostin alustaa olion määriteltyihin alkuarvoihin. Alustus tapahtuu parametrien välityksellä, kuten funktiokutsussa. Kopiointimuodostin alustaa olion jonkin toisen olion arvoihin. Hajotinta (destructor) kutsutaan, kun olio tuhotaan. Automaattinen olio tuhoutuu automaattisesti, kun poistutaan sen määrittelyalueesta (lohkosta). Staattinen olio tuhoutuu ohjelman lopussa. Dynaaminen olio on erikseen tuhottava delete-operaattorilla. Tässä esimerkkiohjelmassa kaikki kolme luku-oliota ovat automaattisia. Ne tuhoutuvat käänteisessä järjestyksessä luontiin verrattuna. Ohjelman muodostimet ja hajotin ilmaisevat keskusmuistiosoitteensa this-osoittimen avulla. This-osoitin osoittaa aina sillä hetkellä aktiivisena olevaan olioon. #include <iostream> using namespace std; class luku private: int x; //Oletusmuodostin alustaa olion nollaksi luku() cout << "Luotiin olio oletusmuodostimella"; cout << " osoitteessa " << this << endl; x=0; //Parametrillinen muodostin //Alustaa olion arvoon param. luku(int param) 4

; cout << "Luotiin olio parametrillisella "; cout << "muodostimella osoitteessa " << this << endl; x=param; //Kopiointimuodostin alustaa olion //jonkin toisen olion arvoilla luku(const luku &olio) cout << "Luotiin olio kopiointimuodostimella "; cout << "osoitteessa " << this << endl; x=olio.x; //Hajotin ~luku() cout << "Tuhottiin olio osoitteessa " << this << endl; //Palvelut void setvalue(); int getvalue() const; int main() luku a;//luonti oletusmuodostimella luku b(2);//luonti param. muodostimella luku c=b; //Luonti kopiointimuodostimella cout << "a = " << a.getvalue() << endl; cout << "b = " << b.getvalue() << endl; cout << "c = " << c.getvalue() << endl; return 0; void luku::setvalue() cout << "Luku?" << endl; cin >> x; int luku::getvalue() const return(this->x); //sama kuin return(x); 5