Löysin eilen ensimmäistä kertaa tietoa static-sanasta ja nyt sen käytöstä on tullut mieleen muutama kysymys:
1)FunktioA sisältää static-muuttujan. Funktio-osoitin FunktioB=(*FunktioA). Onko FunktioB:tä kutsuttaessa muuttuja sama kuin FunktioA:ta kutsuttaessa?
2)Onko mahdollista jakaa sama static-muuttuja monen funktion/luokan kanssa?
3)Periytyykö static-muuttuja vai saako uusi luokka oman muuttujansa?
1) on
2) on
3) riippuu miten periytät
Mikä tahansa static-muuttuja on olemassa tasan yhtenä kappaleena riippumatta mistään osoittimista ja luokista ja muista. Se toimii samaan tapaan kuin globaali muuttuja, mutta sen näkyvyysalue on tietenkin rajoitettu.
Jos luokka A sisältää staattisen muuttujan X, niin voi ajatella, että muuttujan nimi on A::X. Jos luokasta A peritty luokka B sanoo funktiossaan ++X, niin A::X kasvaa — paitsi jos luokalle B on määritelty oma muuttuja X, jolloin tietenkin kasvatetaan sitä. Jos taas B:n instanssista kutsutaan luokalta A perittyä funktiota, tämä funktio ei tietenkään tiedä muuttujasta B::X vaan korottaa muuttujaa A::X. Lisäksi luokan staattista muuttujaa koskevat normaalit luokan näkyvyyssäännöt, eli jos A::X on yksityinen (private), B-luokan funktiot eivät pääse siihen käsiksi. Siitä huolimatta B-luokan A-luokalta perimät funktiot voivat käsitellä sitä, eli b_otus.hae_x()
voi olla täysin kelvollista koodia, jos hae_x on A-luokan funktio.
Mutkikasta? Ei sitä tarvitsekaan ymmärtää, jos jokin jäi epäselväksi, ota kääntäjä käteen ja katso, mitä se sanoo. :)
static
-sanaa voi käyttää myös globaalien muuttujien ja funktioiden nimien kanssa, jolloin merkitys on erilainen: globaalit static-muuttujat ja -funktiot eivät näy oman lähdekooditiedostonsa ulkopuolelle edes extern
-määreen kanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.