C++:ssa on kaksi erikoista jäsenfunktiota (metodia): muodostaja (constructor) ja hajottaja (destructor). Näiden nimet ovat aina luokan_nimi ja ~luokan_nimi. Funktioiden tehtävänä on huolehtia luokan alustuksesta ja hajottamisesta. Alustus tehdään kun olion vaikutusalue alkaa ja hajottaminen vastaavasti kun se loppuu. Muodostajalla voi olla useita muotoja, hajottajalla vain yksi.
/* STRING.CPP */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
class cJono{
char *s;
int max_pit;
int pit;
public:
cJono(char *p) { /* Rakentaja jos alustus merkkijonolla */
max_pit = pit = strlen(p);
s = (char *)malloc(pit+1); // Huom! Oikeasti new kunhan opitaan
if ( !s ) pit = max_pit = 0;
else { strcpy(s,p); max_pit = pit; }
}
cJono(int l=255) { /* Rakentaja jos kutsu kokonaisluvulla */
pit = 0;
max_pit = l;
s = (char *)malloc(max_pit+1);
if ( !s ) max_pit = 0;
}
~cJono() { /* Hävitys aina merkkijonon poisto */
free(s); pit = max_pit = 0;
}
int pituus() const { return pit; }
char kirjain(int i=0) const { if (i<pit) return s[i]; return '#'; }
int sijoita(char *p) {
strncpy(s,p,max_pit); s[max_pit]=0;
return pit = strlen(s);
}
void tulosta(char *fmt="%s\n") const { if ( pit > 0 ) printf(fmt,s); }
};
int main(void)
{
cJono kissa("Kissa"),kana(4);
kana.sijoita("Kana");
kissa.tulosta(); // Kissa
kana.tulosta(); // Kana
kissa.sijoita("Muuttohaukka"); // Muutt
kissa.tulosta();
return 0;
}
Huomattakoon, ettei kumpikaan muodostaja eikä hajottaja ole pakollinen.
Näin on teoriassa, käytännössä kumpikin on parasta
kirjoittaa!