Onko sallittu tehdä tollanen funktio vai voiko tulla ongelmia?
class Piste{ public: int x; int y; void AsetaKoordinaatit(x , y){} };
vai pitääkö tehdä näin:
class Piste{ public: int x; int y; void AsetaKoordinaatit(int xa, int ya){ x=xa; y=ya; } };
Kyllä aina muuttajilla tyypit pitää olla määritelty.
Mutta siis kysyhän ei ollut tyypityksestä. Vaan siitä, että voinko suoraan Funktion otsikkorivillä tehdä tarvittavat sijoitukset jo olemassa oleviin muuttujiin?
Ei. Ainoaksi poikkeukseksi funktioiden kanssa voisi laskea olion luonnissa tapahtuvan alustuksen. Muuten kaikkien funktioiden on toteuttava samaa perusfunktion "kaavaa".
class Piste{ public: int x; int y; Piste(int x, int y) : x(x), y(y) { } };
tkok kirjoitti:
Mutta siis kysyhän ei ollut tyypityksestä. Vaan siitä, että voinko suoraan Funktion otsikkorivillä tehdä tarvittavat sijoitukset jo olemassa oleviin muuttujiin?
Eihän siinä ensimmäisessä esimerkissä mitään sijoituksia edes tehty missään kohtaa. Nuo funktion muuttujat x ja y vain peittävät luokan saman nimisten muuttujien näkyvyyden ko. funktiossa.
Ja vaikka ne ovatkin saman nimisiä, niin ne voivat silti olla tyypiltään eri. Eli sen vuoksi sille funktiolle täytyy määrittää niiden tyypit vaikka jossain muualla ohjelmassa olisikin saman nimisiä muuttujia.
Grez kirjoitti:
]Eihän siinä ensimmäisessä esimerkissä mitään sijoituksia edes tehty missään kohtaa. Nuo funktion muuttujat x ja y vain peittävät luokan saman nimisten muuttujien näkyvyyden ko. funktiossa.
Tämä juuri minua askarutti, että peittävätkö ne funktion määrittelyt olion omat muuttujat x ja y, vai osaako se sijoittaa funktion kutsussa annetuilla muuttujilla olion omat x ja y.
Kiitos vastauksista.
Pakko vielä ihmetellä, miksei tällaista voi esimerkiksi kääntäjän kanssa todeta parilla yksinkertaisella testillä:
// #define TAPA 1 // tai 2, 3, 4 class c { public: int i; c(): i(0) {} #if TAPA == 1 void f(i) {} #elif TAPA == 2 void f(int i) {} #elif TAPA == 3 void f(int i) {i = i;} #elif TAPA == 4 void f(int j): i(j) {} #elif TAPA == 5 void f(int j) {i = j;} #endif }; #include <stdio.h> int main() { c a; printf("ensin %d, ", a.i); a.f(1); printf("sitten %d.\n", a.i); }
bash$ for i in 1 2 3 4 5 ; do echo "TAPA $i:" ; g++ koe.cpp -DTAPA=$i && ./a.out ; done TAPA 1: koe.cpp:6: error: ‘i’ is not a type TAPA 2: ensin 0, sitten 0. TAPA 3: ensin 0, sitten 0. TAPA 4: koe.cpp: In member function ‘void c::f(int)’: koe.cpp:12: error: only constructors take base initializers TAPA 5: ensin 0, sitten 1.
Aihe on jo aika vanha, joten et voi enää vastata siihen.