Fonksiyonların aşırı yüklenmesi (overloading), aynı isme sahip ama farklı imzalara (parametre sayısı veya türü) sahip birden fazla fonksiyon tanımlama mekanizmasıdır.
Parametreler için varsayılan değerler fonksiyon tanımında belirtilebilir. İncelik: varsayılan değerler yalnızca çağrının derlenmesi sırasında dikkate alınır ve derleyici, görünen imzaya göre yerleştirir.
Sınıflarda sıkça karşılaşılan bir durum:
class Printer { void print(int n, char c = '*') { /* ... */ } void print(const std::string& s) { /* ... */ } }; Printer p; p.print(5); // print(int n, char c = '*') fonksiyonunu çağırır, c = '*' p.print("Hi"); // print(const std::string&) fonksiyonunu çağırır
İncelikler:
void foo(int x, int y = 10); void foo(int x); foo(1); // Hata: hangi fonksiyonun çağrılacağı belirsiz
Sınıf üye fonksiyonu için varsayılan değerin belirtilmesine izin verilen tek yer neresidir?
Cevap: Sınıf metoduna varsayılan değer, sınıf içinde (veya sınıf dışında ilk deklarasyonda) belirtilebilir, ancak hem sınıfta hem de realizasyonda belirtmek izin verilmez. Aksi takdirde, tekrar tanımlama hatası ortaya çıkar.
class X { void func(int x = 5); // Burada izin var }; void X::func(int x) { /* ... */ } // Ama burada değil!
Hikaye 1
Bankacılık yazılımında derleme aşamasında bir hata oluştu: farklı varsayılan değerlere sahip bazı aşırı yüklenmiş fonksiyonlar, doğru olana yönelik kesin seçim için engeller oluşturdu, çağrılar derleme aşamasında belirsiz hale geldi — sonuç olarak, manuel düzeltmeler yapılmadan bir sürüm oluşturma imkânsızlığı.
Hikaye 2
Ekipte, tüm varsayılan değerlerin uygulamaya taşınması tarzı yaygındı, ancak bazı sınıf metodları için bu, arayüz ve uygulama arasında uyumsuzluklara neden oluyordu — farklı TU'lar fonksiyonun farklı parametrelerini gördü, bu da garip derleme ve çalışma zamanı hatalarına yol açıyordu.
Hikaye 3
Kamuya açık bir kütüphane genişletilirken, aynı parametrelerle, ancak farklı varsayılan değerlerle bir fonksiyon aşırı yüklenerek hata yapıldı. Derleyici API çağrılarında belirsizlik göstermeye başladı ve kullanıcılar, eski çağrılar ve bozulmuş ikili uyumluluklarla karşılaştı.