previous next Up Title Contents Index

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ä.


previous next Up Title Contents Index