Menu
Coddy logo textTech

Fonksiyon Aşırı Yükleme

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 57 / 104.

Fonksiyon aşırı yükleme, aynı ada ancak farklı parametre listelerine sahip birden çok fonksiyon tanımlamanıza olanak tanır. Derleyici, geçirdiğiniz bağımsız değişkenlere göre doğru sürümü seçer. Bu, derleme zamanı polimorfizminin temel bir biçimidir.

Aşırı yüklemenin çalışması için işlevlerin imzaları; parametre sayısı, türleri veya her ikisi bakımından farklı olmalıdır:

class Calculator {
public:
    int add(int a, int b) {
        return a + b;
    }
    
    double add(double a, double b) {
        return a + b;
    }
    
    int add(int a, int b, int c) {
        return a + b + c;
    }
};

Calculator calc;
calc.add(5, 3);        // add(int, int) çağırır
calc.add(2.5, 3.7);    // add(double, double) çağırır
calc.add(1, 2, 3);     // add(int, int, int) çağırır

Derleyici her Call ifadesini inceler ve onu uygun overload ile eşleştirir. Bu işlem tamamen derleme zamanında gerçekleşir; dolayısıyla çalışma zamanında ek yük oluşmaz.

Önemli: Tek başına dönüş türü, aşırı yüklenmiş işlevleri birbirinden ayırt etmez. Aşağıdaki kod derleyici hatasına neden olur:

int getValue();
double getValue();  // Hata: yalnızca dönüş tipine göre aşırı yükleme yapılamaz

Fonksiyon aşırı yükleme, kodunuzu daha sezgisel hâle getirir. addInts, addDoubles ve addThreeInts gibi ayrı adlar oluşturmak yerine, anlamlı tek bir ad kullanır ve gerisini derleyiciye bırakırsınız.

challenge icon

Görev

Kolay

Fonksiyon aşırı yüklemesinin gücünü gösteren bir mesaj biçimlendirici sınıfı oluşturalım. Farklı girdi türlerini işleyen birden çok Formatter yöntemine sahip bir format() sınıfı oluşturacaksın; böylece derleyici, kendisine ilettiğin değerlere göre doğru sürümü seçebilecek.

Kodunu iki dosyada düzenleyeceksin:

  • Formatter.h: Farklı senaryoları işleyen aşırı yüklenmiş Formatter yöntemlerine sahip bir format() sınıfı tanımla:
    • Tek bir std::string alan ve şunu yazdıran bir yöntem: Message: <text>
    • Bir std::string ve bir int öncelik düzeyi alan ve şunu yazdıran bir yöntem: [Priority <priority>] <text>
    • Bir std::string ve bir double zaman damgası alan ve şunu yazdıran bir yöntem: [<timestamp>s] <text>
    • Üç std::string parametresi (gönderen, alıcı, mesaj) alan ve şunu yazdıran bir yöntem: From <sender> to <receiver>: <message>
    Tüm yöntemler format() olarak adlandırılmalıdır: derleyici, bağımsız değişkenlere göre doğru olanı seçecektir.
  • main.cpp: Dört girdi oku (her biri ayrı bir satırda):
    1. Basit bir mesaj metni
    2. Bir öncelik düzeyi (tam sayı)
    3. Bir zaman damgası (double)
    4. Bir gönderen adı

    Bir Formatter nesnesi oluştur ve aşırı yüklenmiş dört yöntemin tümünü göster:

    • format() çağrısını yalnızca mesaj metniyle yap
    • format() çağrısını mesaj metni ve öncelikle yap
    • format() çağrısını mesaj metni ve zaman damgasıyla yap
    • format() çağrısını gönderen, alıcı olarak "Admin" ve mesaj metniyle yap

Örneğin girdiler System ready, 3, 12.5 ve Server olduğunda:

Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System ready

Aynı yöntem adını format() dört kez çağırdığını, ancak her çağrının bağımsız değişkenlerin türlerine ve sayısına göre farklı bir sürümü çalıştırdığını fark et. Bu, derleme zamanı polimorfizminin iş başındaki hâlidir: derleyici, program daha çalışmaya başlamadan önce hangi aşırı yüklemeyi kullanacağını belirler.

Kendin dene

#include <iostream>
#include <string>
#include "Formatter.h"

using namespace std;

int main() {
    // Girdileri oku
    string message;
    getline(cin, message);
    
    int priority;
    cin >> priority;
    
    double timestamp;
    cin >> timestamp;
    cin.ignore();
    
    string sender;
    getline(cin, sender);
    
    // TODO: Bir Formatter nesnesi oluştur
    
    // TODO: format() metodunu yalnızca mesaj metni ile çağır
    
    // TODO: format() metodunu mesaj metni ve priority ile çağır
    
    // TODO: format() metodunu mesaj metni ve timestamp ile çağır
    
    // TODO: format() metodunu sender, alıcı olarak "Admin" ve mesaj metni ile çağır
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi