struct avulla,
minkä jälkeen sitä voi käyttää koodissa.
Esimerkiksi seuraavassa tietueessa piste
on kaksi int-kenttää x ja y:
pisteen x- ja y-koordinaatti.
Koodi luo pisteen (1,3) ja muuttaa sitten x-koordinaattia.
struct piste {
int x, y;
};
int main() {
piste a = {1,3};
cout << a.x << " " << a.y << "\n"; // 1 3
a.x = 2;
cout << a.x << " " << a.y << "\n"; // 2 3
}
a:n
sisältö kopioidaan b:hen eikä
b:n muuttaminen myöhemmin vaikuta a:han.
piste a = {1,3};
piste b = a;
b.x = 2;
cout << a.x << " " << a.y << "\n"; // 1 3
cout << b.x << " " << b.y << "\n"; // 2 3
Seuraavassa koodissa p on osoitin a:han,
jolloin muutos tapahtuu a:ssa.
Merkintä -> viittaa osoittimen kautta tietueen
kenttään, ja p->x tarkoittaa samaa kuin (*p).x.
piste a = {1,3};
piste *p = &a;
p->x = 2;
cout << a.x << " " << a.y << "\n"; // 2 3
cout << p->x << " " << p->y << "\n"; // 2 3
Esimerkiksi seuraava koodi määrittelee luokan
laskuri, jossa on laskurin arvoa
säilyttävä kenttä x sekä kaksi funktiota:
kasvata lisää arvoa yhdellä ja
arvo palauttaa arvon.
struct laskuri {
int x = 0;
void kasvata() {
x++;
}
int arvo() {
return x;
}
};
int main() {
laskuri a;
cout << a.arvo() << "\n"; // 0
a.kasvata();
cout << a.arvo() << "\n"; // 1
a.kasvata();
cout << a.arvo() << "\n"; // 2
}
Luokan ideana on, että se kokoaa yhteen johonkin kokonaisuuteen
liittyvät tiedot ja niitä käsittelevät funktiot.
Tämä on olio-ohjelmoinnin lähtökohta.
struct testi {
testi() {
cout << "Moikka!\n";
}
};
int main() {
testi t; // tulostaa "Moikka!"
}
Tavallinen konstruktorin käyttökohde on olion alustaminen
sen luomisen yhteydessä.
Luokalla voi olla useita konstruktoreita,
joilla voi olla eri parametreja.
Esimerkiksi seuraavassa luokassa on kaksi konstruktoria. Ensimmäisessä konstruktorissa ei ole parametria, jolloin alkuarvo on 0. Toisessa konstruktorissa parametrina annetaan alkuarvo.
struct laskuri {
int x;
laskuri() {
x = 0;
}
laskuri(int a) {
x = a;
}
// ...
};
Seuraava koodi esittelee asiaa:
laskuri a; laskuri b(5); cout << a.arvo() << " " << b.arvo() << "\n"; // 0 5Tässä on vielä lyhempi tapa toteuttaa sama asia alustuslistan avulla:
struct laskuri {
int x;
laskuri() : x(0) {}
laskuri(int a) : x(a) {}
// ...
};
x on yksityinen
(private), mikä tarkoittaa, että sitä voi käyttää
vain luokan sisällä.
Funktiot ovat sen sijaan julkisia (public),
jolloin niitä voi käyttää myös luokan ulkopuolella.
struct laskuri {
private:
int x = 0;
public:
void kasvata() {
x++;
}
int arvo() {
return x;
}
};
Koska funktiot ovat julkisia,
voimme käyttää niitä kuten ennenkin:
int main() {
laskuri a;
a.kasvata();
cout << a.arvo() << "\n";
}
Kuitenkaan emme pääse enää käsiksi suoraan kenttään x:
int main() {
laskuri a;
a.x++; // virhe!
cout << a.x << "\n"; // virhe!
}
Tässä on ideana, että luokan julkiset funktiot tarjoavat
rajapinnan, jonka avulla käytämme oliota,
emmekä pääse käsiksi luokan sisäiseen toteutukseen.