Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Operaattorin ylikuormitus

Sivun loppuun

vesikuusi [05.05.2011 16:31:21]

#

Lyhyesti: Kirjassa luokan esittelyssä homma tehdään näin (Etuliiteoperaattori):

Luokka& operator ++();

Myöhemmin tuli jälkiliiteoperaattori:

Luokka operator ++(int);

Huomasin, että tuostahan puuttuu tuo aiempi &-merkki Luokan jälkeen O.O
Kirjassa ei ole missään mitään selitystä sille, miksi tuo merkki tuohon edes pistetään. Liittyykö jotenkin viittaamiseen? Kokeilin etuliiteoperaattorin ylikuormittamista ilman &-merkkiä ja hyvin toimi. Onko tuolla merkillä jotain toiminnallista tarkoitusta operaattorin ylikuormituksessa?

Metabolix [05.05.2011 16:42:01]

#

Kyseessä on aivan tavallinen viittausmerkintä. Operaattoreissa ei ole mitään ihmeellistä, ne toimivat aivan muiden funktioiden tavoin. Voisit yhtä hyvin tehdä mieleisesi funktion nimeltä operaattori_plusplus_etu (tai jalki) ja kutsua sitä. Paluuarvon tyyppiä ei ole millään tavalla määrätty, voit laittaa siihen vaikka aivan eri luokan.

Oletko perillä siitä, mitä kyseiset operaattorit tekevät esimerkiksi tavalliselle kokonaisluvulle? Kokeile:

int a1 = 0;
int a2 = ++a1;
std::cout << a1 << ", " << a2 << std::endl;

int b1 = 0;
int b2 = b1++;
std::cout << b1 << ", " << b2 << std::endl;

Kuten näet, jälkiliiteoperaattorin palauttama arvo on eri kuin käsitellyn objektin arvo. Tällä tavalla toimiva operaattori ei siis voi palauttaa viittausta, vaan sen pitää kopioida ennen muutosta vanha arvo talteen ja palauttaa se kokonaisena.

vesikuusi [05.05.2011 16:44:55]

#

juu, ymmärrän kyllä, että operaattori on ihan kuin muutkin funktiot, mutta haluaisin tietää, miksi tuo viittaus ja kannattaako sitä turhaan sinne pistää?

Metabolix [05.05.2011 16:47:31]

#

Jos luokka ei ole pieni, triviaali dataluokka, viittauksen palauttaminen on tehokkaampaa kuin turhan kopion luominen. Erityisesti se on tehokkaampaa, jos arvo jää usein käyttämättä. Kannattaa kylläkin palauttaa const-viittaus, jos ei ole erityistä syytä palauttaa muokattavaa versiota. Toisaalta jos palautettavaa arvoa ei tarvita koskaan, voi saman tien laittaa tyypiksi void ja ottaa returnin pois.

vesikuusi [05.05.2011 16:53:24]

#

okei, yritän tajuta vielä, miten tuo viittaaminen vaikuttaa palautettavaan arvoon :D varsinkin, kun tuossa toisessa ei viitata..ehkä kaikkea ei tarvi tietää, kunhan osaa käyttää

The Alchemist [05.05.2011 17:27:37]

#

Jutun juju on se, että on turhaa olla käyttämättä viittausta aina, kun se on järkevää. Ja kyllä viittausten ja pointtereiden käyttö on niin peruslaatuinen juttu C++:ssa, että ne on pakko osata, ja osaaminen taas vaatii tietämystä.

Torgo [05.05.2011 17:32:14]

#

vesikuusi kirjoitti:

okei, yritän tajuta vielä, miten tuo viittaaminen vaikuttaa palautettavaan arvoon :D varsinkin, kun tuossa toisessa ei viitata..

Metabolix tämän asian jo selitti, mutta yritetään nyt vielä vääntää rautalangasta. Jos paluuarvona on luokka itsessään, niin luokasta tehdään kopio. Varsinkin jos luokka on suuri, niin tähän kopioimiseen kuluu runsaasti aikaa ja myöskin muistia. Jos palautetaan viittaus, niin silloin ainoastaan kerrotaan että tässä tämä luokka nyt olisi ilman että resursseja tuhlataan turhaan kopioimiseen. Jos viittaus on const-tyyppinen, niin viittauksen kautta ei päästä koskemaan alkuperäiseen luokkaan; ainoastaan lukemaan.

Kuten Metabolix tuossa osoitti, niin etu- ja jälkioperaattorin ero on siinä, että jälkioperaattori muuttaa luokan arvoa vasta kun muut operaatiot on suoritettu. Etuoperaattori puolestaan muuttaa sitä heti. Luokkien tapauksessa kääntäjä ei osaa aavistaa millaista käytöstä ohjelmoija operaattorille haluaisi ja järjestellä käännettyä koodia sen mukaan. Siispä jälkioperaattorilla ei voi palauttaa viittausta, koska jos se niin tekisi, olisi lopulla lausekkeella käytössään väärä arvo. Etuoperaattorilla ongelmaa ei ole, koska arvon halutaankin muuttuvan välittömästi. Näin ollen mitään välikopiota ei tarvitse ottaa, vaan luokasta voidaan palauttaa viittaus siihen itseensä.

vesikuusi kirjoitti:

ehkä kaikkea ei tarvi tietää, kunhan osaa käyttää

Ei kaikkea tietenkään tarvitse, eikä voikaan tietää. Kielen perusteet tulee kuitenkin tietää, että osaa soveltaa edes jollain tasolla. Ja viittaukset jos mitkä, kuuluvat c++:n perusteisiin.

vesikuusi [05.05.2011 22:12:03]

#

kiitooss :D


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta