C++ Fonksiyonların Aşırı Yüklenmesi

Orijinal hali ile Function Overloading olarak bilinir. Aynı isme sahip iki ya da daha fazla fonksiyona, aşırı yüklenmiş fonksiyon denir. Aşağıdaki kodu inceleyelim:
#include <iostream>

using namespace std;

int islem(int a){}
int islem(int a, int b, int c){}
float islem(double a){}
float islem(float s){}
char islem(){}


int main(){
    return 0;
}
Yukarıdaki kodda görüldüğü gibi beş tane aşırı yüklenmiş fonksiyon var. Bu kod derlendiğinde derleyici hata vermeyecektir. Burada dikkat edilmesi gereken, aşırı yüklenmiş fonksiyon yazarken parametrelerin aynı tip ve aynı sayıda olmaması gerekir. Aşağıdaki örnekte olduğu gibi:
int islem(int a){}
float islem(int a){}
Böyle bir durumda derleyici aşağıdaki hatayı verecektir.
error: ambiguating new declaration of 'float islem(int)'
 float islem(int a){}
                  ^
note: old declaration 'int islem(int)'
 int islem(int a){}
     ^
Aşırı yüklenmiş fonksiyon mantığında, derleyici parametreye göre seçtiği fonksiyonu derler. Aşağıdaki kısa örneği ve çalışma sonucunu inceleyelim:
#include <iostream>

void yaz(int);
void yaz(double);

int main(){
    int a = 23;
    double b = 3.2345234;

    yaz(a);
    yaz(b);

    return 0;
}

void yaz(int n){
    std::cout << n << std::endl;
}

void yaz(double n){
    std::cout << n << std::endl;
}
Ekran çıktısı:
23
3.23452

Aşırı yüklenmiş fonksiyonlardan biri int diğeri ise double veri tipinde parametreye sahip. Her ikisi de değer döndürmeyen fonksiyonlardır. a değişkeni int tipinde tanımlanıp başlatılmış, b değişkeni double tipinde tanımlanıp başlatılmış. Her iki değişkenin değerini de ekrana yazdırmak için aynı metot kullanılıyor. a değeri int tipinde olduğu için parametresi int olan fonksiyona gönderiliyor, b değeri double tipinde olduğu için parametresi double olan fonksiyona gönderiliyor.

Neden Kullanılıyor?

Oldukça benzer metotlar için farklı isimlendirmeler yapmak yerine aynı isme sahip metotlar kullanmak daha mantıklıdır. Programın karmaşıklığını azaltır.

Güncelleme 1

Fonksiyonları aşırı yüklerken her veri tipi için ayrı ayrı aynı fonksiyon yapısını yazmak yerine, template kullanımı ile fonksiyonu kere bir yazıp aşırı yükleyebilmemiz mümkündür. Aşağıdaki kod örneğini inceleyin.
#include <iostream>

template <typename T>
T yaz(T deger){
    return deger;
}

int main(){
    int m1 = 1312312;
    char m2[] = "merhaba";
    double m3 = 12.43434;

    std::cout << yaz(m1) << " " << yaz(m2) << " " << yaz(m3) << std::endl;
}

Hiç yorum yok:

Yorum Gönderme