February 16, 2018

Herkese İyi Akşamlar,

ben "[]" operatörünü aşırı yüklemede

int'& 'Array::operator; ve
int Array::operator(int)'const' şeklinde aşırı yükleniyor. Anlamadığım kısım şu: Burda ki const ve & ne işe yarıyor
ve neden her ikisnde de yok ?

Şimdiden Teşekkürler

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2018

Öyle bir bildirimin sonundaki const, derleyiciye "bu işlev içindeyken üyelerini değiştirmeme izin verme" anlamına geliyor. Bir anlamda, this göstergesi o işlev içindeyken 'const' oluyor.

Buradaki işleç yüklemelerinde belirli bir indekse karşılık gelen bir eleman var (her zaman asıl bir eleman olması gerekmiyor ama öyle olduğunu düşünebiliriz). O elemana iki farklı biçimde erişmek isteyebiliriz: değerini kullanmak veya değerini değiştirmek.

Değerini değiştirmek için erişmek istiyorsak dönüş değeri olarak 'int&' yapıyoruz; yoksa o elemanın kendisi değil, kopyası dönerdi. (& işlecinin burada "referans" anlamına geldiğini hatırlayarak.) Bildirimin sonuna da const koymuyoruz çünkü o zaman elemanı değiştiremezdik çünkü derleyiciden bizi bu konuda engellemesini istemiş olurduk.

Değerini değiştirmek değil de değerini kullanmak istiyorsak amacımız değiştirmek olmadığından sonuna const yazıyoruz. Dönüş değeri olarak kopya döndürmekte bir sakınca olmadığından da int döndürüyoruz. 'const int &' da döndürebilirdik ama çağıranlar referans üzerinden erişeceklerinden bir ihtimal daha yavaş olabilirdi. (Ölçmeden bilinemez.) Ama elemanın türü int yerine büyükçe bir yapı olsaydı, 'const BenimYapim &' filan döndürebilirdik. (Bu durumda bile ölçmek gerek ama genel kanı, böyle durumlarda referans döndürme yönünde.)

İki yükleme kullanılmasının nedeni de hem güvenli erişime hem değiştirmeye olanak sağlamak.

Not: Aslında const olanı tanımlamak şart değildir çünkü programcıların dikkatli olacaklarını bekleyebiliriz. Ancak, const olan tanımlanmamışsa indeksleme işlecini bu türün const nesneleri üzerinde kullanamazdık çünkü değiştirmeme korumasını derleyiciden istememiş durumda olurduk.

void foo(const BuTur & nesne) {
   nesne[i];    // const yükleme olmasaydı bu bir derleme hatası olurdu
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]