ProgramlamaC++ Mühendisi

C++'de sınıf üye fonksiyonları için aşırı yükleme ve varsayılan parametrelerin nasıl çalıştığını açıklayın. Aşırı yüklenmiş fonksiyonlar ve varsayılan değerlerin birlikte kullanımında hangi incelikler vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Bir fonksiyonu aşırı yüklerken yalnızca varsayılan değerler ile ayırt etmeye çalışmak bulanıklığa yol açar.
void foo(int x, int y = 10); void foo(int x); foo(1); // Hata: hangi fonksiyonun çağrılacağı belirsiz

Kandırmaca Sorusu.

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!

Konunun incelikleri nedeniyle gerçek hata örnekleri.


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ı.