Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

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 parametrejä. Tosiasiassa kummassakin niitä on täsmälleen sama määrä. Nimittäin jokaisen metodin ensimmäisenä näkymättömänä parametrinä 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 parametreissä 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ä.

Usein this-osoitinta käytetään, jos ei haluta antaa metodin parametrilistan muuttujille eri nimiä kuin vastaavilla attribuuteilla:

	void cAika::aseta(int h, int m) {
	  this->h = h; this->m = m; lisaa(0);
	}


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys