9.3.11 this- osoitin
Jos verrataan funktiota
void lisaa(tAika *pAika, int lisa_min)
{
int yht_min = pAika->h * 60 + pAika->m + lisa_min;
pAika->h = yht_min / 60;
pAika->m = yht_min % 60;
}
...
lisaa(&a1,55);
ja metodia
void cAika::lisaa(int lisa_min)
{
int yht_min = h * 60 + m + lisa_min;
h = yht_min / 60;
m = yht_min % 60;
}
...
a1.lisaa(55);
niin helposti näyttää, että ensin mainitussa funktiossa on
enemmän parametreja. Tosiasiassa kummassakin niitä on
täsmälleen sama määrä. Nimittäin jokaisen
metodin ensimmäisenä näkymättömänä
parametrina tulee aina itse luokan osoite, this.
Voitaisiinkin kuvitella, että metodi onkin toteutettu:
"void cAika::lisaa(cAika *this,int lisa_min)" // Näin EI SAA KIRJOITTAA!!!
{
int yht_min = this->h * 60 + this->m + lisa_min;
this->h = yht_min / 60;
this->m = yht_min % 60;
}
...
"a1.lisaa(a1,55)";
Oikeasti this - osoitinta ei saa esitellä, vaan se on
ilman muuta mukana parametreissa sekä esittelyssä että kutsussa.
Mutta voimme todellakin kirjoittaa:
void cAika::lisaa(int lisa_min)
{
int yht_min = this->h * 60 + this->m + lisa_min;
this->h = yht_min / 60;
this->m = yht_min % 60;
}
Jonkun mielestä voi jopa olla selvempi käyttää
this- osoitinta luokan attribuutteihin viitattaessa, näinhän
korostuu, että käsitellään nimenomaan tämän
luokan attribuuttia h, eikä mitään globaalia muuttujaa
h. Joskus this- osoitinta tarvitaan
välttämättä palautettaessa oliotyyppisellä metodilla
olion koko tila (esim. viite olioon). Lisäksi joissakin kielissä
this- osoittimen vastinetta (usein self) on aina
käytettävä.