Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.3.4 Luokka (class) ja kapselointi

Virallisesti luokat esitellään C++:ssa class- avainsanalla struct- avainsanan sijasta. Mikä ero sitten class- avainsanalla on? Kumpikin käy, mutta attribuuteille ja metodeille on suojaustasot, jotka oletuksena struct- määritellyssä luokassa kaikki ovat julkisia, eli metodeja voi kutsua kuka tahansa ja erityisesti kuka tahansa voi muuttaa attribuuttien arvoja ilman että olio tätä itse huomaa.


Kuka voi käyttää metodia/attribuuttia
Oletuksena
Suojaus
kaikki
aliluokat
friend- funktiot
luokan metodit
struct
union
class
private


x
x

x
protected

x
x
x


public
x
x
x
x
x

Kuva 9.1 Suojaustasot

Jos esimerkkimme luokka esiteltäisiin:

	class cAika {
	  int h,m;
	  void lisaa(int lisa_min)  {...}
	  void tulosta() const      {...}
	};

lakkaisi ohjelmamme toimimasta, koska esimerkiksi pääohjelman kutsu

	a1.lisaa(55)

tulisi laittomaksi kaikkien luokan jäsenten ollessa yksityisiä ( private). Ongelmaa voisi yrittää korjata esittelemällä metodit julkisiksi:

	class cAika {
	  int h,m;
	public:
	  void lisaa(int lisa_min)  {...}
	  void tulosta() const      {...}
	};

Nyt kääntäjä valittaisi esimerkiksi:

	Error:  aikacla.cpp(21,13):Objects of type 'cAika' cannot be initialized with { }

rivistä

	cAika a1={12,15},...

Nyt vasta alkaakin olio- ohjelmoinnin hienoudet! Aloittelijasta saattaa tuntua että mitä turhaa tehdään asioista monimutkaisempaa kun se onkaan! Nimittäin aikaolio.cpp saattoi tuntua kohtuullisen ymmärrettävältä. Mutta todellakin jos olisi ilman muuta sallittua sijoittaa oliolle mitä tahansa arvoja, niin mitä mieltä oltaisiin seuraavasta:

	cAika a1={42,175};

Väärinkäytetyt ja virheelliset arvot muuttujilla on ollut ohjelmoinnin kiusa alusta alkaen. Nyt meillä on mahdollisuus päästä niistä eroon kapseloinnin (jotkut sanovat kotelointi, encapsulation) ansiosta. Eli kaikki arvojen muutokset (eli olio tapauksessa olion tilojen muutokset) voidaan suorittaa kontrolloidusta, vain olion itse siihen suostuessa. Mutta miten sitten alustuksen tapauksessa?


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys