Tam Sürümünü Görmek İçin : const
quasimodo
18/12/2007, 01:19
void f1(int const* p1, int* p2)
{
*p2 = 42;
}
void f2(int const* p1)
{
*(int*)p1 = 36;
}
void foo()
{
int const i1 = 1;
int i2 = 2;
f1 (&i1, (int*)&i1); // 1
f2 (&i1); // 2
f1 (&i2, &i2); // 3
f2 (&i2); // 4
}
Bu 4 tane fonksiyon cagrisi icin ne diyebiliriz?
const_cast yapmaya çalışıyorsan zaten bir cast ifadesi var.kullanabilirsin.
lektroon
18/12/2007, 21:04
1. fonksiyonda, degeri const olan bir adresi geciriyorsun. Dolayisiyla, adres degerini const deger olmayan bir adrese cevirip fonksiyona gecirmen birseyi degistirmez, i1'in degeri degismez.
2. fonksiyonda, ayni seyi iceride yapmaya calisiyorsun ancak sonuc degismez. Cunku i1 objesinin degeri (dikkat adresi degil) const tanimlanmis.
3. fonksiyonda, degeri const olmaya i2 objesini geciriyorsun, dolayisiyla onun degeri degisecektir.
4. fonksiyonda, degeri const olmayan bir objeyi, degeri const olan bir pointer uzerinden geciriyorsun. Ancak iceride o pointerin gosterdigi adres aliniyor. Bu adreste de, gecirdigin objenin deger bilgisi oyle tanimlanmamis oldugundan, const olmayan bir deger var. Dolayisiyla onun da degeri degisecektir.
acehreli
21/12/2007, 19:23
lektroon, aslinda 'const' olarak tanimlanmis bir nesneyi degistirmenin sonucu tanimsizdir. Ornegin program o sabit nesneyi degistirilemeyen bir bellek bolgesine koyduysa program gocebilir. (Cogu modern ortamda boyle olur.) Yani ilk iki durum belirsiz.
Ucuncu durumda bir sorun yok cunku i2 sabit degil zaten.
Dorduncu durumda da hicbir sorun yok, cunku i2 asil olarak sabit bir nesne degil. O, tam da const_cast'in kullanimini gerektiren bir kullanim.
Ali
Not: C'deki parantezli tUr donusumunu C++'ta kullanmaya gerek yoktur. Kullanmayalim, kullananlari uyaralim. :)
lektroon
21/12/2007, 19:30
Dogru, degeri const tanimlanmis bir objenin degerini degistirmeye calismak belirsiz bir davranisa yol acabilir. Ancak sanirim derleyiciden derleyiciye degisebiliyor.
Tur donusumu icin C-Style casting kullanilmamasi gerektigine de katiliyorum.
acehreli
21/12/2007, 19:33
Derleyiciden derleyiciye degisebiliyor olmasi da iste tanimsiz oldugunu gosteriyor. :D
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.