7.5 C++:n vakiot
Koska makrojen käyttöön liittyy tiettyjä
tyyppitarkistuksiin/oikeellisuuskirjoitukseen liittyviä riskejä,
kannattaa C++:ssa mieluummin käyttää tyypitettyjä vakioita
(seuraavan esimerkin const- rivit toimivat tosin C- kielessäkin):
c-alk\hello2.cpp - tervehdys "vakioksi"
// Ohjelma tulostaa tekstin Hello world!
#include <iostream.h>
const char *TERVE = "Hello ";
const char *MAAILMA = "world";
int main(void)
{
cout << TERVE << MAAILMA << "!" << endl;
return 0;
}
Valitettavasti on tilanteita, joissa makroja on edelleen lähes pakko
käyttää. Esimerkiksi merkkijonojen yhdistäminen TERVE
MAAILMA tyyliin ei onnistu. Myöhemmin opimme joitakin muitakin
tilanteita, joissa makrot ovat "välttämättömiä".
Erityisesti lukuvakioiden määrittelyssä const- vakiot
ovat omimmillaan:
c-alk\kuutio.cpp - monikulmion tiedot vakioksi
// Ohjelma tulostaa tietoja monitahokkaasta
#include <iostream.h>
#include <iomanip.h>
const char *TAHOKAS = "Kuutiossa";
const int KARKIA = 8;
const int SIVUTASOJA = 6;
const int SARMIA = 12;
int main(void)
{
cout<<setw(20)<<TAHOKAS<<" on "<<setw(2)<<KARKIA <<" kärkeä,\n";
cout<<setw(20)<<" " <<" "<<setw(2)<<SIVUTASOJA<<" sivutasoa,\n";
cout<<setw(20)<<" " <<" "<<setw(2)<<SARMIA <<" särmää" << endl;
return 0;
}
- Päättele seuraavasta esimerkistä miksi const-
vakiot ovat parempia kuin #define - makrot.
c-alk\const.cpp - vakion ja #definen erot
// Ohjelmalla tutkitaan mikä ero on const ja #define -vakioiden välillä
#include <iostream.h>
const int sormia = 1 + 4;
#define VARPAITA 1 + 4
int main(void)
{
int syht = 2 * sormia;
int vyht = 2 * VARPAITA;
cout << "Sormia = " << syht << " ja varpaita = " << vyht << endl;
return 0;
}
-
- Selitä mistä virhe johtuu? Miten virhe saadaan tässä
tapauksessa poistettua?
-