yüklenmiş işlev çözümlemesinde özel durumlar – 3

Aşağıdaki kod hakkında sorulacak bazı sorulara yanıt vermeniz isteniyor:

Birinci soru: Yukarıdaki kodda bir işlev yüklemesi (function overloading) var mı?
İkinci soru : Yukarıdaki kod geçerli mi?

Önce birinci soruya yanıt verelim. Bu bir işlev yüklemesi. Aynı bilinirlik alanı (scope) içinde farklı imzaya sahip aynı isimli işlevler bir yükleme (overloading) oluşturur. İmzaları farklı bu iki işlev Myclass sınıfının bilinirlik alanında (class scope). Sınıfların farklı erişim ayrıcalıklarına sahip bölümleri, yani public, private ya da protected bölümleri farklı bilinirlik alanları değildir, değil mi?

Gelelim ikinci sorunun yanıtına: Kod geçersiz.
C++ dilinde aşağıdaki sırayla gerçekleşen 3 ayrı süreci birbirinden ayırmak çok önemli:
isim arama (name lookup)
yüklenmiş işlev çözümlemesi (function overload resolution)
erişim kontrolu (access control)

İsim arama, derleyicinin bir ismin neyin ismi olduğunu anlama sürecidir. Derleyici daha kodu atomlarına ayırırken (tokenizing) hangi atomların isim (identifier) olduğunu saptar. Daha sonra gerçekleşen bir süreçte derleyici isimlerin hangi varlıklara ilişkin olduğunu anlar.
Yüklenmiş işlev çözümlemesi sürecinde derleyici, bir işlev çağrısı ifadesi karşılığında aynı isimli işlevlerden hangisinin çağrılması gerektiğini belirler.
Erişim kontrolü, söz konusu isme ilişkin varlığı kullanan kodun bu varlığı kullanma izni olup olmadığına ilişkin derleyicinin yaptığı kontroldür. Sınıfların public, protected ve private bölümlerinde tanıtılan varklıkları hangi kodları kullanabileceğine ilişkin dilin temel kuralları var.

Erişim kontrolu en son yapılır. İlk iki süreç gerçekleştirilirken erişim hakları, izinleri ya da ayrıcalıkları dikkate alınmaz. Yukarıdaki kodda int parametreli func işlevinin sınıfın private bölümünde bildirilmesi, bu işlevin isim arama ya da yüklenmiş işlev çözümlemesi süreçlerine dahil edilmeyeceği anlamına gelmiyor.

çağrısında işleve gönderilen argüman int türden olduğu için derleyici çözümleme kurallarına göre çağrılacak işlev olarak int parametreli func işlevini belirleyecek. Bu işlev seçildikten sonra erişim kontrolü yapılacak. Çözümleme sonucu seçilen işlev sınıfın private bölümünde bildirilmiş olduğu için yani erişim kuralları çiğnendiği derleyici için sentaks hatası verecek.

Share

Necati Ergin

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

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun
Eklemek istediğiniz kodları lütfen aşağıdaki “pre” kodları arasında yazınız.
<pre class="lang:c++ decode:true ">
--yazacağınız kodlar--
</pre>
(buradan kopyalayarak kullanabilirsiniz)