üye işlev referans niteleyicileri

C++11 ile gelen araçlardan biri üye işlev referans niteleyicileri (member functions reference qualifiers). Sentaksa değinmeden önce amacı anlamaya çalışalım. Normal olarak bir sınıfın üye işlevlerini hem sol taraf değeri (lvalue) olan sınıf nesneleri hem de sağ taraf değeri (rvalue) olan sınıf nesneleri için çağırabiliyoruz. Aşağıdaki koda bakalım:

Yukarıdaki kodda Myclass sınıfının func işlevine 3 ayrı çağrı yapıldığını görüyorsunuz.

ifadesinde işlev bir sol taraf değeri olan m nesnesi için çağrılıyor.

ifadesinde ise func işlevi geçici bir Myclass nesnesi için çağrılıyor. Bu şekilde oluşturulan geçici sınıf nesnelerinin sağ taraf değeri olduklarını hatırlayalım.

Yukarıdaki çağrıda ise func üye işlevi bir başka üye işlevi olan foo‘nun geri dönüş değeri ile çağrılıyor. foo işlevinin geri dönüş değeri bir referans olmadığından func işlevi yine bir sağ taraf değeri olan nesne ile çağrılmış oluyor.

C++11’de bir sınıfın static olmayan bir üye işlevin gizli parametre değişkeni olan (*this) nesnesini sol taraf değeri ya da sağ taraf değeri olarak niteleyebiliyoruz. Bu amaçla işlev bildiriminde & ve && atomları kullanılıyor. Aşağıdaki örneğe bakalım:

& ya da && atomlarının bildirimde const anahtar sözcüğünden sonra gelmesi gerektiğine dikkat edelim. Peki bu bildirimler ne anlama geliyor? Bir sınıfın static olmayan tüm işlevlerinin aslında bildirimde açıkça yazılmayan bir parametre değişkeni var, değil mi? Bu parametre değişkeni *this nesnesi. Yukarıdaki kodda bildirilen üye işlevler global işlevler olsaydı parametrik yapıları şöyle olacaktı:

A sınıfı türünden bir nesne için yukarıdaki üye işlevlerden biri çağrıldığında derleyici geçerlilik kontrollerini yukarıdaki bildirimlere göre yapacak:

Bizi daha çok ilgilendiren durum işlev yüklemesi: Bir sınıfın aynı isimli ve aynı imzaya sahip iki ya da daha fazla işlevi farklı referans niteleyicilerine göre yüklenebilir:

Yukarıdaki kodda Myclass sınıfının geri dönüş değeri ve parametre değişkeni olmayan func isimli iki ayrı işleve sahip olduğunu görüyorsunuz. İşlevlerden biri sol taraf değeri olan nesneler için diğeri sağ taraf değeri olan nesneler için tanımlanmış. Bir sol taraf değeri olan Myclass nesnesi ile func işlevine çağrı yapıldığında & ile nitelenen, bir sağ taraf değeri olan Myclass nesnesi için func işlevine çağrı yapıldığında çağrılan && ile nitelenen işlev olacak. Yüklemeye const işlevler de dahil edilebilir. Böylece bir sınıf nesnesinin hem sol taraf değeri olup olmamasına göre hem de const olup olmamasına göre farklı işlevlerin çağrılmasını sağlayabiliyoruz:

Yüklenmiş işlevlerin çözümlenmesi (function overload resolution) konusundaki kurallara göre yukarıdaki kod çalıştırıldığında aşağıdaki çıktının elde edilmesi gerekiyor:

Aynı isimli ve aynı imzaya sahip işlevlerden biri bir referans niteleyicisi almış ise diğer işlevlerin de referans niteleyici alması zorunlu:

Yukarıdaki kodda tanımlanan Myclass sınıfı içinde geri dönüş değeri olmayan int parametreli iki func işlevi bildirilmiş. Bildirilen ilk işlev yalnızca sol taraf değeri nesnelerine hizmet vermek için & niteleyecisi almış. Diğer func işlevi ise herhangi bir referans niteleyicisi almamış. Derleyici kodu geçersiz kabul edecek.

Necati Ergin

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

Bunlar da ilginizi çekebilir

üye işlev referans niteleyicileri” için 3 yorum

  1. Necati Bey selamlar,
    Yazıda geçen func().f3(); ifadesi iki farklı derleyici tarafından da derlenebildiği görüldü. Derleyicilerin sizin anlattığınızdan farklı davranmasının sebebi nedir acaba?

  2. Selamlar,
    Emeğinize sağlık, oldukça açıklayıcı.
    İnşallah bu ışıklar sayesinde filin tamamını göreceğiz.

Bir Cevap Yazın

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

Kod Eklemek İçin Okuyun