Biliyorsunuz ki C 'de bir aynı işlemi int double vb. farklı türler için yapan fonksiyonların isimleri birbirlerinden farklı olmak zorundadır. Bu engel C++ ve nesne yönelimli programlama dillerinde function overloading sayesinde kalkmış bulunmakta.
Şimdi hangi durumlarda function overloading olur bir ona bakalım;
- Fonksiyonlar aynı scope 'a dahil olmak zorundalar.
- İsimleri aynı, imzaları (signature) farklı olmak zorunda. (imzanın ne olduğunu açıklayacağım).
Bu temel gerekliliklere yakından bir bakalım. Aynı scope'da olmalı dedik eğer farklı scope'da iseler scope arama sırasına göre ilk bulunan fonksyion çağırılır. Eğer bu fonksiyon ile isim uyumlu parametreler uyumsuz ise error olur.
İmzaları (signature) farklı dedik peki bu imza nedir. İmza bir fonksiyonun parametre değişkenleri denebilir, geri dönüş değeri imzaya dahil değildir yani int foo(int) ile boolean foo(int) aynı scope da olsalar dahi overload olmazlar error olur.
Anahtar Not : typedef isimleri overload'u etkilemez.
Anahtar Not : Fonksiyonun anlamını değiştirmeyen const 'lar overload olmazlar fakat fonksiyonun çalışmasını değiştiren const 'lar overload olurlar bunada const overloading denir. ÖR :
int foo(const int) int foo(int) call by value olduğundan anlam değişmez overload olmaz redeclaration olur.
int foo(const int*) int foo(int *) call by ref. olduğundan anlam değişir overload.
Overload 'u anladığımıza inanıyorum ve Overload Resolution'a (işleme) bölümüne geçiyorum bakalım derleyici overloadlarda hangisini seçeceğine nasıl karar veriyor.
!Fonksiyon çağrısının errorle sonuçlanma sebepleri :
1) Çağıracak fonksiyon bulamamak uygun parametreli fonksiyonun bulunmaması.
2) Ambiguity durumu (birden fazla uygunluk).
Aşamalar :
1) İsimden kaç tane var araştırılır. (Aday fonksiyonlar, isimleri ve scopeları aynı olacak, parametreye bu aşamada bakılmaz)
2) Gönderilen argümanlar 1. aşamayı geçen fonksiyonların hangileri ile legal olarak çağırılabilir bakılır. (Match Function)
3) Fonksiyonun seçilme aşaması (Best Match)
Bu aşamada seçilme şu sıra ile yapılır:
Exact Match(Tam Uyumluluk) : Bunun olması için gönderilen fonksiyonun parametre türleri birebir fonksiyon ile tutmalı.
Promotion (Yükseltme) : Alt tür gönderilip fonksiyonda üst türe dönüştürme.
Standart Conversion : Dönüşüm var ise promotion değil!
User-Defined Conversion: Eğer uygun constractor var ise olan dönüşüm.
Bunlar sırası ile kuvvete sahiptir ilk tam uyumluluk durumuna bakılır eğer o var ise diğerleri seçilmez.
Ambiguity : Eğer iki adet aynı klasmanda fonksyion var ise ( iki adet standart conversion gibi) derleyici hangisini seçeceiğini bilemez ve ambiguity olur.
Bugünde yazımızın sonuna geldik zor bir konuyu atlattık düzenlemeleri yapacağım herkese iyi günler hatam var ise affola.
Hiç yorum yok:
Yorum Gönder