yüklenmiş işlev çözümlemesinde özel durumlar – 4 (const yüklemesi)

Aşağıdaki bildirimlere bakalım:

Bu bir işlev yüklemesi (function overloading). Bu şekilde yapılan bir yüklemeye “const yüklemesi” (const overloading) deniyor. Her iki işlevin de parametresi bir gösterici (pointer). Ancak ikinci işlevin parametresi gösterdiği yer const olan bir gösterici (pointer to const object / low level const).
func
işlevi bir adresle çağrıldığında derleyici hangi işlevin çağrıldığını nasıl anlayacak? Eğer işlev çağrısı bir const nesne adresi ile yapılırsa zaten birinci func işlevi uygun (viable) olmaktan çıkıyor. Bu durumda çağrılan ikinci işlev olacak. Çağrının const olmayan bir nesne adresi ile yapılması durumunda her iki işlev de çağrıya uygun düşse de dilin kurallarına göre çağrılan ikinci işlev olacak. Aşağıdaki koda bakalım:

const yüklemesi gösterici semantiği ile yapılabildiği gibi referans semantiği ile de gerçekleştirilebiliyor. T bir tür olmak üzere

Yukarıdaki bildirimlere göre func işlevine T türünden const olmayan bir nesne gönderildiğinde çağrılan birinci işlev, const bir nesne gönderildiğinde ise çağrılan ikinci işlev olacak.

İşlevlerin parametreleri gösterici ya da referans değilse bildirimde kullanılan const anahtar sözcüğü bir anlam farklılığı yaratmıyor:

Yukarıdaki bildirimler bir işlev yüklemesi oluşturmuyor. Derleyici ikinci deyimi bir “yeniden bildirim” (function redeclaration) kabul eder. Birinci işlev tanımlandıktan sonra ikinci bildirim için ayrı bir tanımın verilmesi (redefinition) sentaks hatasına neden olurdu.

const yüklemesinden en sık sınıfların static olmayan üye işlevleri (non static member functions) için faydalanılıyor:

Yukarıdaki kodda tanımlanan A isimli sınıfın biri const biri const olmayan iki üye işlevi var. Her iki işlevin de const‘luk dışında imzaları aynı. Derleyici açısından bakarsak bu işlevlerin parametrik yapısı şöyle

Değişen bir şey yok. func işlevine A sınıfı türünden const olmayan bir nesne ile çağrı yapıldığında derleyici birinci işlevi, const olan bir A sınıf nesnesi ile çağrı yapıldığında derleyici ikinci işlevi seçecek.

Peki const yüklemesi ne işe yarıyor? Bir sınıf nesnesinin const olması o sınıf nesnesinin değişmeyeceğini yalnızca okuma amacıyla kullanılabileceğini anlatıyor, değil mi? const bir sınıf nesnesini değiştirme girişiminde bulunmak her şeyden önce mantıksal bir hata. const yüklemesi ile const olan ve const olmayan sınıf nesneleri için farklı kodların seçilmesi mümkün oluyor. const sınıf nesneleri için seçilen yükleme (overload) nesneyi değiştirmeden onu salt okuma amaçlı kullanıyor.

STL const yüklemesinden yoğun bir şekilde faydalanıyor. STL kaplarının (container), kapta tutulan öğelere erişim sağlayan front, back, operator[ ] işlevleri için const yüklemesi yapılmış.
Örneğin vector sınıfının kapta tutulan ilk öğeye erişimi sağlayan front isimli üye işlevlerini düşünelim. İşlevin (basitleştirilmiş) bildiriminin aşağıdaki gibi olduğunu düşünebilirsiniz:

const olan vector nesneleri için geri dönüş değeri const T& olan üye işlev, const olmayan vector nesneleri için geri dönüş değeri T& olan üye işlev çağrılacak. Bu durumda const bir vector nesnesinin ilk öğesine front işleviyle eriştiğimizde bu öğeyi değiştirmeye yönelik yazacağımız bir kod geçerli olmayacak. Aşağıdaki koda bakalım:

Yukarıdaki kodda

deyimi geçerli değil. Çağrılan işlevin geri dönüş değeri türü const string & olduğundan, işlevin geri döndürdüğü nesne için sadece sınıfın const üye işlevlerine çağrı yapabiliriz.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

yüklenmiş işlev çözümlemesinde özel durumlar – 4 (const yüklemesi)” için 2 yorum

  1. Necati Bey selamlar,

    ifadesinde arada virgül unutulmuş.

    1. Merhaba,

      Burada virgül yok. İşlevin (temsili) tek bir parametre değişkeni var. Gösterici parametre değişkeni hem kendisi const (top level) hem gösterdiği yer (low level) const.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun