Tarihçesi
C++, başından beri, aynı adı taşıyan ancak farklı parametrelere sahip birden fazla işlevi tanımlama imkanı sunan bir dil olarak tasarlanmıştır. Bu, okunabilir ve kullanışlı bir API oluşturmaya olanak tanır.
Sorun
Aynı isimde çok sayıda işlev olduğunda, derleyicinin aşırı yüklenmiş işlevler arasından, argüman tiplerini, dönüştürmeleri, varsayılan parametreleri ve referansları dikkate alarak uygun uygulamayı seçmesi gerekir. Dikkatsiz aşırı yükleme durumlarında belirsizlikler ve zor tespit edilebilir hatalar ortaya çıkabilir.
Çözüm
Derleyici, argüman dizisinin en iyi eşleşmesi, tür eşleşmesinin doğruluğu ve minimum dönüşümler temelinde işlevi seçer. Ancak şunları dikkate almak gerekir: anlamlı dönüşümler veya varsayılan argümanlar varsa, beklenmedik bir belirsizlikle karşılaşabilirsiniz.
Kod örneği:
void foo(int x); void foo(double x); void foo(int x, int y = 0); foo(5); // void foo(int x) çağrılır, çünkü bu tam bir eşleşme foo(5.2); // void foo(double x) çağrılır foo(5, 6); // void foo(int x, int y) çağrılır
Anahtar özellikler:
İşlevleri yalnızca dönüş tipine göre aşırı yüklemek mümkün mü?
Hayır. Aşırı yükleme yalnızca parametre türleri ve sayısı ile mümkündür, dönüş tipleri aşırı yükleme çözümünde yer almaz.
int foo(); double foo(); // Hata: yalnızca dönüş tipine göre aşırı yükleme mümkün değildir!
Tüm parametreler dönüştürülebilir olduğunda derleyici hangi aşırı yüklenmiş işlevin çağrılacağını nasıl seçer?
Derleyici "en iyi eşleşmeyi" — tür dönüşümleri için minimum dönüşüm gerektiren veya tam eşleşme sağlayan işlevi seçer. Eğer belirsizlik oluşursa, kod derlenmez.
void bar(int); void bar(long); bar(1); // int tam eşleşme: bar(int) çağrılacak
Varsayılan argümanlarla aşırı yüklemeyi ve normal aşırı yüklemeyi karıştırmak mümkün mü?
Mümkün, ancak işlev imzaları örtüşüyorsa çağrıda belirsizlik oluşabilir.
void test(int x); void test(int x, int y = 10); test(5); // Hata: belirsizlik — her ikisi de geçerli
Kütüphanede, örtüşen varsayılan argümanlara sahip aşırı yüklenmiş işlevler bulunur, bu da kod güncellemesi sırasında derleme hatalarına neden olur.
Artılar:
Eksiler:
Projede bir anlaşma yapılmış — varsayılan argümanlarla aşırı yüklemeyi karıştırmamak ya da yalnızca bir işlevi varsayılan değerlerle kullanmak veya benzersiz parametrelerle saf bir şekilde aşırı yüklemek.
Artılar:
Eksiler: