Tam Sürümünü Görmek İçin : C++ da *& ilişkisi
Varsayalım bir fonksiyon tanımladık:
void f1(class<T> *& t)cont;
1-Bu fonksiyonda *& her ikisinin birden verilmesinin anlamı nedir?Şahsen * ile & bir arada kullanılınca bir birlerini elediklerini öğrenmiştim.
2-Bu fonksiyonun const olarak tanımlanmasına rağmen t nin temsil ettiği yapıyı değiştirebilme imkanı varmı?Öğrendiğim kadarıyla getter ve setter ların const olma ilişkisinde setter olamaz.Çünkü setterlar değişiklik yapan fonksiyonlardır.
acehreli
10/04/2007, 18:27
1) Soyledigin gibi, bir kod satirinda kullanildiginda birbirlerini etkilerini yok ederler. Cunku o baglamda & islecinin anlami "bu nesneye isaretci"dir, * islecinin anlami ise "isaretcinin gosterdigi nesne"dir. Dolayisiyla "bu nesneye isaretcinin gosterdigi nesne" oluyor. Yani nesnenin kendisi.
Ama & islecinin C++'ta baska anlami da vardir: referans (takma ad olarak da dusunulebilir):
int & referans = gercek_nesne;
referans = 42; // gercek_nesne degisir
Once class<T>'yi kaldiralim, cunku bu soruyla dogrudan ilgisi yok. Izninle *& karakterlerini de birbirlerinden ayiracagim. Neden bazi insanlarin onlari bitisik yazmak istediklerini hicbir zaman anlamamisimdir.
Elimizde soyle bir islev bildirimi var:
void f1(BirTur * & t) const;
Burada t, BirTur isaretcisi referansidir. Ya da; t, gercekte varolan bir BirTur isaretcisinin takma adidir. Ben t'yi degistirirsem gercek nesne degisir. Bu kullanimi C'de kullanmak zorunda oldugumuz isaretciye isarecti ile bagdastirabiliriz: void f1(BirTur * * t) const;
int birinci = 1;
int ikinci = 2;
void f1(BirTur * & t)
{
t = &ikinci;
}
void foo()
{
int * isaretci = &birinci;
f1(isaretci);
// Bu noktada 'isaretci' ikinciyi gostermektedir
}
2) Oge islevler adlarinin sonuna koyulan 'const', o islevin uzerinde cagrildigi nesnenin degistirilemeyecegini bildirir, ona gonderilen parametrelerle bir ilgisi yoktur. Eger f1 'const' bir oge islevse:
nesne.f1(isaretci);
yazildiginda degistirilemeyen sey 'nesne'dir.
Eger o isleve gonderilen parametrenin degistirilmeyecegini bildirmek istiyorsak bunu parametre listesinde yapariz:
void f1(const int t); // t degistirilemez
void f1(const int * t); // t'nin gosterdigi degistirilemez
void f1(int * const t); // t degistirilemez
void f1(const BirTur * & t); // t, 'const BirTur isaretcisine referanstir'; t degistirilemez
void f1(BirTur * const & t); // t, 'BirTur isaretcisi referansidir'; bu t takma adi kullanilarak gercek isaretci degistirilemez
void f1(const BirTur * const & t); // Son ikisinin bilesimi :)
Ali
golgepapaz
11/04/2007, 06:26
1)
2) Oge islevler adlarinin sonuna koyulan 'const', o islevin uzerinde cagrildigi nesnenin degistirilemeyecegini bildirir, ona gonderilen parametrelerle bir ilgisi yoktur. Eger f1 'const' bir oge islevse:
nesne.f1(isaretci);
yazildiginda degistirilemeyen sey 'nesne'dir.
Ali
const fonksiyonlar ait olduklari nesnelerin ogelerini bir durumda degistiribilirler.eger o
oge "mutable" tanimlanmissa.
class A
{
public:
A(){};
changeX(int xv) const {this->x=xv;} //ok. x mutable
changeY(int yv) const {this->y=yv;) // derleme hatasi
int toplam() { return a+b};
mutable int x;
int y;
};
Ayrica const olan bi nesne nin sadece const fonksiyonlarini
cagirabilirsiniz.
mesela
void topla(const A& val)
{
int toplam= val.toplam(); //hata
}
val nesnesi fonksiyona const gectigi icin, toplam fonksiyonu
nesnenin ogelerini degistirmedigi halde cagrilamaz.bu yuzden
nesnenin ogelerinin degistirmeyen butun fonksiyonlarin const tanimlanamasi
iyi bir pratiktir.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.