2.4.1 Yleistä funktioista

Funktio on kokoelma C++-kielen lauseita, joka suorittaa jonkin edeltäkäsin määritellyn tehtävän. Tähän mennessä on jo käytetty ainakin funktioita main ja printf. Edellinen on itse tehty funktio ja jälkimmäinen on ns. kirjastofunktio, joka on kirjoitettu jossakin muualla.

C++-kielinen ohjelma on joukko funktioita. Yksinkertaisimmillaan ohjelma koostuu yhdestä ainoasta funktiosta, jonka nimi on main. Jokaisessa ohjelmassa tulee aina olla main-funktio, josta ohjelman suoritus alkaa.

2.4.1.1 Funktion määrittely

Funktion määrittely eli toteutus kertoo kääntäjälle, mitä funktion tulisi tehdä. Määrittely koostuu otsikosta ja lohkosta. Funktion otsikossa kerrotaan funktion mahdollisesti palauttaman arvon tyyppi, funktion nimi ja funktiolle välitettävien tietoalkioiden eli parametrien tyypit ja nimet. Funktion lohkossa ovat varsinaiset toimintalauseet. Funktion yleinen muoto on siis

tyyppi nimi(parametrit)
{
  lauseet;
}

Funktion suoritus päättyy, kun funktion viimeinen lause on suoritettu tai kun suoritetaan return-lause.

2.4.1.2 Funktion esittely

Funktio pitää aina esitellä ennen kuin sitä voidaan kutsua (siis käyttää). Edellä kuvattu funktion määrittely, silloin kun se on kirjoitettu ohjelmatiedostoon ennen kutsua, myös esittelee funktion. Funktio voidaan kuitenkin esitellä ensin ns. prototyypillä ja määritellä vasta myöhemmin. Funktion prototyyppi on muotoa

tyyppi nimi(parametrit);

siis sama kuin funktion otsikko (ja lisäksi puolipiste). Funktion määrittelyyn ei vaikuta, onko funktio esitelty prototyypillä vai ei; määrittelystä ei saa jättää pois funktion otsikkoa. (Huomaa myös, että määrittelyssä funktion otsikko ei pääty puolipisteeseen.)

2.4.1.3 Funktion kutsu

Funktion kutsu on lauseke, jossa ohjelmaa käsketään tekemään funktiossa määritelty toimenpide. Funktion kutsu voi olla itsenäinen lause:

printf("Olet %3d vuotias!\n", ika);

tai sitten osa lausetta:

tulos = 5*fabs(luku);

(funktio fabs laskee liukuluvun itseisarvon).

Funktiolle voidaan välittää tietoa kutsuvasta ohjelmanosasta argumenttien välityksellä. Esimerkiksi edellä printf-funktion kutsussa esiintyvät argumentteina teksti "Olet %3d vuotias!\n" ja muuttujan ika arvo. Funktio tulkitsee saamansa tiedon ja tekee sitten ennalta määrätyt tehtävät (eli tulostaa näytölle tekstin, johon on sijoitettu muuttujan arvo, ja laittaa perään rivinvaihdon).

2.4.1.4 Arvon palauttaminen

Funktio voi nimessään palauttaa kutsuvaan ohjelmakohtaan jonkin arvon. Palautettavan arvon tyyppi määritellään funktion tyyppinä esittelyn yhteydessä. Kun funktio suoritetaan ja suorituksessa kohdataan lause

return arvo;

lopetetaan funktion suorittaminen ja palataan siihen ohjelmakohtaan, josta funktiota kutsuttiin. Palattaessa tuodaan mukana tieto arvo, jonka tyypin täytyy olla sama (tai ainakin tulkittavissa samaksi) kuin funktion paluuarvolle määrätty tyyppi.

Tarkastellaan seuraavaa esimerkkiä:

/* *********************************************************
ARVO1.CPP
  Harjoitellaan arvon palauttamista funktiosta.
********************************************************* */

#include <iostream.h>

/* Funktio tulostaa näytölle rivin tekstiä ja palauttaa
   kokonaislukuarvon 5. Ei parametreja.                 */
int viitonen(void)
{
  cout << "Nyt ollaan viitonen-funktiossa!\n";
  return 5;
}

int main(void)
{
  int luku;

  cout << "\n\n";
  luku = 10;
  cout << "Nyt ollaan main-funktiossa. ";
  cout << "Luku on " << luku << ".\n";

  luku = viitonen(); // funktion kutsu

  cout << "Nyt ollaan jälleen main-funktiossa. ";
  cout << "Luku on " << luku << ".\n";

  return 0;
}

Ohjelman suoritus alkaa funktiosta main. Ohjelman sisällä tapahtuu seuraavaa:

int luku; Varataan tila muuttujalle luku.

cout... Tulostetaan pari rivinvaihtoa.

luku = 10; Sijoitetaan muuttujalle arvo 10.

cout... Tulostetaan tekstiä ja luku-muuttujan arvo.

luku = viitonen(); Ensin kutsutaan funktiota viitonen. Kutsuttaessa siirretään huomio (ohjelmaosoitin, "kohta, jossa ollaan menossa") ko. funktion alkuun. Funktiossa viitonen suoritetaan seuraavat lauseet:

cout... Tulostetaan näytölle tekstiä.

return 5; Lopetetaan funktion suoritus ja palautetaan lopetuksen yhteydessä kokonaisluku 5 kutsuvaan yksikköön (tässä tapauksessa main-funktiolle). Paluuarvon tyyppi määräytyy funktion nimen edessä olevan tyyppimääritteen mukaan.

luku = viitonen(); (jatkuu) Funktiosta palataan takaisin siihen kohtaan, mihin jäätiin ennen funktioon siirtymistä. Saatu paluuarvo sijoitetaan muuttujaan luku.

cout... Tulostetaan tekstiä ja luku-muuttujan arvo.

return 0; Lopetetaan pääohjelma ja palautetaan käyttöjärjestelmälle arvo 0.

C++-kielisen ohjelman suoritus tapahtuu siten, että käyttöjärjestelmä kutsuu funktiota main. Ohjelman suoritus päättyy, kun viimeinen funktion main lause on suoritettu tai kun suoritetaan lause return. Useimmiten ohjelman viimeiseksi lauseeksi kirjoitetaan

return 0;

jolloin ohjelma palauttaa kutsuvalle yksikölle, eli käyttöjärjestelmälle, arvon 0. Tästä käyttöjärjestelmä voi päätellä, että ohjelman suoritus tapahtui virheittä.

Jos kyseessä on laaja ohjelmisto, jossa kutsutaan useampaa ohjelmaa (tai funktiota), voidaan paluuarvojen avulla kertoa kutsuvalle yksikölle, mikä meni vikaan ja kenties täten voidaan toipua virhetilanteesta. Jos kyseessä on esimerkiksi tulostusfunktio tulosta, joka on määritelty palauttamaan kokonaisluku kutsuvalle ohjelmanosalle, voitaisiin tulostuksen onnistumista kuvata esimerkiksi seuraavilla palautuksilla:

0 kaikki kunnossa,

1 kirjoittimessa ei ole virta päällä,

2 paperi loppu,

3 kirjoitin on varattuna.

Näiden paluuarvojen avulla voitaisiin joko neuvoa käyttäjää toimimaan virheen korjaamiseksi (tapauksissa 1 ja 2) tai yrittää kenties uudelleen hetken kuluttua (tapaus 3).