Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen.

Samankaltaiset esitykset


Esitys aiheesta: "Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen."— Esityksen transkriptio:

1 Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen. Automaattiset toiminnot voivat aktivoitua järjestelmän käynnistämänä tai ohjelmoijan käynnistämänä. Olion luontiin liittyvät vaiheet ovat olion tilanvaraus ja olion alustus.

2 Luokan muodostintMyn2 Olion tuhoamiseen liittyvät vaiheet ovat olion tyhjennys ja olion tilanvapautus. Olion tilanvaraus- ja tilanvapautushetki määräytyy olion muistinvarausluokan perusteella.

3 Luokan muodostintMyn3 Olion muistinvarausluokka voi olla Automaattimen –Olio on paikallinen lohkossa. –Järjestelmä varaa oliolle keskusmuistitilan olion määrittelyn yhteydessä pinosta. –Järjestelmä vapauttaa oliolle varatun keskusmuistitilan automaattisesti lohkon loppuessa. Dynaaminen –Ohjelmoija varaa oliolle keskusmuistitilan new-operaattorilla, tilanvaraus tapahtuu vapaasta muistista eli keosta (heap).

4 Luokan muodostintMyn4 –Ohjelmoija vapauttaa tilan delete-operaattorilla. –Olioon voidaan viitata monen eri tunnuksen avulla, tunnukset ovat yleensä paikallisia lohkossa. Staattinen –Olio on static-määreellä esitelty paikallinen olio. –Järjestelmä varaa oliolle keskusmuistitilan pääohjelman käynnistyksen yhteydessä. –Järjestelmä vapauttaa oliolle varatun keskusmuistitilan pääohjelman loppuessa.

5 Luokan muodostintMyn5 Olion luontiin eli tilanvaraukseen liittyy olion tunnuksen esittely ja olion määrittely. Olion esittely liittää tunnuksen nimen olion tyyppiin eli luokkaan. Olion määrittely luo olion eli määrittely varaa keskusmuistitilan olion tiedoille. Olio saa luotaessa luokkansa mukaisen kehyksen eli luokka määrää sille varattavat tietojäsenet. Jäsenfunktiot eivät kopioidu jokaiselle oliolle, vaan kaikki luokan oliot käyttävät kertaalleen talletettua ohjelmakoodia.

6 Luokan muodostintMyn6 Olion alustus tapahtuu tilanvarauksen yhteydessä. Olion tietojäsenten alustustoimenpiteet sisältyvät erityiseen alustusta varten kirjoitettuun jäsenfunktioon, jota kutsutaan muodostimeksi (constructor). Yhdessä luokassa voi olla useita kuormitettuja (overloaded) muodostimia erilaisia käyttötilanteita varten. Muodostimet voidaan jakaa kolmeen ryhmään:

7 Luokan muodostintMyn7 oletusmuodostin (default constructor) –Olion tietojäsenten alustus oletusarvoilla. kopiointimuodostin (copy constructor) –Olion tietojäsenten alustus toisesta oliosta kopioimalla. ohjelmoijan määrittelemät parametrilliset muodostimet –Olion tietojäsenten alustus ohjelmoijan tapauskohtaisesti määräämillä alkuarvoilla.

8 Luokan muodostintMyn8 Overloading a function name: If you have two or more function definitions for the same function name, that is called overloading. When you overload a function name, the function definitions must have different number of formal parameters or some formal parameters of different types. When there is a function call, the compiler uses the function definition whose number of formal parameters and types of formal parameters match the arguments in the function call.

9 Luokan muodostintMyn9 Luokkaan määritellään muodostimia, jotta voitaisiin varmistaa, että olion tietojäsenet ovat alustettuja ja että ohjelma ei keskeydy ajonaikaiseen virheeseen tietojäsenen sisältöön viitattaessa. Muodostinta kutsutaan kerran yhtä oliota kohti. Jos olion luonnin jälkeen halutaan olion tietojäsenet alustaa uudelleen, on käytettävä vaikkapa sijoitusta. Järjestelmä kutsuu muodostinta automaattisesti olion tilanvarauksen yhteydessä.

10 Luokan muodostintMyn10 Olion tietojäsenten tyhjennys tapahtuu olion tilanvapautuksen yhteydessä. Tyhjennykseen liittyvät toimenpiteet sisältyvät jäsenfunktioon hajotin (destructor). Luokassa voi olla vain yksi hajotin. Hajotinta voidaan kutsua tilanvapautushetken lisäksi myös muulloin, kun olio halutaan tyhjentää - tämä on käytännössä harvinaista.

11 Luokan muodostintMyn11 Oletusmuodostin (default constructor) alustaa olion tietojäsenet oletusarvoilla. Oletusmuodostin voi olla kääntäjän generoima tai ohjelmoijan kirjoittama. Kääntäjä generoi luokalle oletusmuodostimen vain, jos ohjelmoija ei ole toteuttanut luokkaan muodostimia. Järjestelmä kutsuu oletusmuodostinta automaattisesti olion tilanvarauksen yhteydessä. Oletusmuodostimeksi voitaneen myös kutsua muodostinta, joka kysyy ohjelman käyttäjältä arvot tietojäsenille!

12 Luokan muodostintMyn12 Olion tilanvaraus aiheuttaa oletusmuodostimen kutsun: Luokka olio; Luokka olio=Luokka(); Ensimmäisellä rivillä on automaattisen olion tunnuksen esittely, joka on samalla olion määrittely. Määrittely varaa oliolle keskusmuistitilan ja aiheuttaa automaattisesti oletusmuodostimen kutsun (joka voi olla myös ohjelmoijan tekemä!). Toisella rivillä kutsutaan itse tehtyä oletusmuodostinta.

13 Luokan muodostintMyn13 Jos ohjelmoija haluaa olion tietojäsenet alustettavaksi tietyillä oletusalkuarvoilla, hänen on määriteltävä itse oletusmuodostin. Oletusmuodostimen esittely: class Luokka { public: Luokka();... };

14 Luokan muodostintMyn14 Oletusmuodostimen esittelyssä ja määrittelyssä on huomioitava mm. seuraavaa: –Oletusmuodostimen nimi on luokan nimi. –Oletusmuodostin ei saa parametreja. –Oletusmuodostimella ei ole tyyppiä, oletusmuodostin ei siis palauta return-lauseella mitään. –Oletusmuodostinta koskevat samat näkyvyyssäännöt kuin muitakin luokan jäsenfunktioita. Oletusmuodostimeksi tulkitaan sellainen muodostin, jota voi kutsua ilman argumentteja.

15 Luokan muodostintMyn15 Tästä syystä oletusmuodostin voi myös olla parametrillinen muodostin, jonka kaikilla parametreilla on oletusarvo. Luokassa voi olla ainoastaan yksi oletusmuodostin. Tietojäsenten alustus muodostimessa voidaan kirjoittaa kahteen kohtaan: Oletusmuodostimen toteutus: Luokka::Luokka():tieto(lauseke), tieto(lauseke),... { }

16 Luokan muodostintMyn16 tieto on alustettava tietojäsen, lauseke on muuttuja, vakio tai jokin muu lauseke, jonka arvolla tietojäsen alustuu. Tätä alustustapaa voidaan käytetään, kun alustuslauseke on yksinkertainen. Tietojäsenten alustus muodostimen rungossa: Luokka::Luokka() { tieto=lauseke;... }

17 Luokan muodostintMyn17 #include "stdafx.h" #include using namespace System; using namespace std; class Opiskelija { public: Opiskelija(); void AsetaNimi(); void AsetaRyhma(); void AsetaOpjakso(); void HaeTiedot(); private: string m_nimi; string m_ryhma; string opintojakso; };

18 Luokan muodostintMyn18 Opiskelija::Opiskelija() { cout<<"Oletusmuodostin, olio "<<this<<"."<<endl; AsetaNimi(); AsetaRyhma(); AsetaOpjakso(); } void Opiskelija::AsetaNimi() { cout<<"Anna nimi: "; getline(cin, m_nimi); } void Opiskelija::AsetaRyhma() { cout<<"Anna ryhm\204: "; getline(cin, m_ryhma); }

19 Luokan muodostintMyn19 void Opiskelija::AsetaOpjakso() { cout<<"Anna opintojakson nimi: "; getline(cin, opintojakso); } void Opiskelija::HaeTiedot() { cout<<"Perustiedot:"<<endl <<"Nimi: "<<m_nimi<<endl <<"Ryhm\204: "<<m_ryhma<<endl <<"Opintojakso: "<<opintojakso<<endl; }

20 Luokan muodostintMyn20 int main(array ^args) { Opiskelija eka=Opiskelija(); eka.HaeTiedot(); eka.AsetaNimi(); eka.HaeTiedot(); return 0; }

21 Luokan muodostintMyn21 Jos ohjelmoija haluaa alustaa oliot tilanvarauksen yhteydessä tapauskohtaisilla alkuarvoilla – siis kysymättä mitään ohjelman käyttäjältä - ohjelmoija voi määritellä luokkaan parametrillisen muodostimen. Luokassa voi olla monta parametrillista muodostinta erilaisia alustustilanteita varten (= muodostimen kuormittaminen). Parametrillinen muodostin on aina ohjelmoijan kirjoittama. Parametrillisen muodostimen esittelyssä ja määrittelyssä noudatetaan samoja sääntöjä kuin oletusmuodostimen yhteydessä.

22 Luokan muodostintMyn22 Huomaa kuitenkin seuraavat asiat: –Parametrillisen muodostimen parametreihin voidaan määritellä tarvittaessa myös oletusarvot. –Luokka voi sisältää useita erilaisilla parametreilla varustettuja muodostimia. –Parametrillinen muodostin, jonka kaikilla parametreilla on oletusarvo, toimii oletusmuodostimena! –Kääntäjä ei generoi oletusmuodostinta, jos ohjelmoija on määritellyt luokkaan parametrillisen muodostimen.

23 Luokan muodostintMyn23 #include "stdafx.h" #include using namespace System; using namespace std; class Ympyra { public: Ympyra(); void AsetaSade(); Ympyra(double); void AsetaSade(double); void LaskeAla(); private: double m_sade; };

24 Luokan muodostintMyn24 Ympyra::Ympyra() { cout<<"Oletusmuodostin, olio "<<this<<"."<<endl; AsetaSade(); } void Ympyra::AsetaSade() { cout<<"Anna s\204de: "; cin>>m_sade; } Ympyra::Ympyra(double sade) { cout<<"Parametrillinen muodostin, olio "<<this<<"."<<endl; AsetaSade(sade); }

25 Luokan muodostintMyn25 void Ympyra::AsetaSade(double sade) { m_sade=sade; } void Ympyra::LaskeAla() { const double pii=3.141593; cout<<"Ala on "<<pii*m_sade*m_sade <<" pa-yksikk\224\204."<<endl; }

26 Luokan muodostintMyn26 int main(array ^args) { Ympyra eka=Ympyra(5.981); eka.LaskeAla(); eka.AsetaSade(); eka.LaskeAla(); return 0; }

27 Luokan muodostintMyn27 Demonstroidaan vielä, että jos parametrillisella muodostimella on oletusarvo, niin se toimii oletusmuodostimena. Oletusarvo annetaan luokan määrittelyn yhteydessä, ei muodostimen rungon toteuttamisen yhteydessä. Aluksi säilytetään tuo alkuperäinen oletusmuodostin, ja näin varmistutaan, että ohjelmassa voi olla vain yksi oletusmuodostin. Muilta osin esimerkki on sama kuin edellinen:

28 Luokan muodostintMyn28 //sama kuin edellisessä esimerkissä … class Ympyra { public: Ympyra(); Ympyra(double=5.0945); void AsetaSade(); void AsetaSade(double); void LaskeAla(); private: double m_sade; }; … //sama kuin edellisessä esimerkissä Nyt on kaksi muodostinta, jotka täyttävät oletus- muodostimen tunnusmerkit! Warning: 'Ympyra' : multiple default constructors specified

29 Luokan muodostintMyn29 //sama kuin edellisessä esimerkissä … int main(array ^args) { Ympyra eka=Ympyra(); eka.LaskeAla(); eka.AsetaSade(); eka.LaskeAla(); return 0; } Error: 'Ympyra::Ympyra' : ambiguous call to overloaded function


Lataa ppt "Luokan muodostintMyn1 Luokan muodostin Olioihin kohdistuvia automaattisia toimintoja ovat luonti, alustus, kopiointi, sijoitus, tyhjennys ja tuhoaminen."

Samankaltaiset esitykset


Iklan oleh Google