C++ Ile Nesne Yönelimli Programlama (Overloading(Aşırı Yükleme))
--
Bu yazılar https://www.tutorialspoint.com/cplusplus/ adresindeki yazı dizilerinin çevirileridir.
C++ bir fonksiyon adı veya aynı kapsamdaki bir operator için birden fazla tanım belirtmenize olanak sağlar. Bu, sırasıyla fonksiyon overloading(aşırı yükleme) ve operator(işleç) overloading (aşırı yükleme) olarak adlandırılır.
Aşırı yüklenmiş(overloaded) bir bildirme, her iki bildirmenin de farklı argümanlara ve açıkça farklı tanımlara(implementelere) sahip olması dışında, aynı kapsamda önceden bildirilen bir bildirme ile aynı ada sahip bir bildirmedir.
Aşırı yüklenmiş bir fonksiyonu veya operatoru çağırdığınızda, derleyici; fonksiyonu veya operatoru çağırmak için kullandığınız bağımsız değişken tiplerini tanımlarda belirtilen parametrelerin tipleriyle kıyaslayarak kullanılacak en uygun tanımı belirler.
En uygun aşırı yüklenmiş fonksiyonu veya operatoru seçme işlemine overload resolution(aşırı yükleme çözümü) denir.
Fonksiyon Aşırı Yüklemesi
Aynı kapsamda aynı fonksiyon adı için birden fazla tanımınız olabilir. Ama fonksiyonun tanımı, tipler ve/veya bağımsız değişken listesindeki bağımsız değişkenlerin sayısı açısından birbirinden farklı olmalıdır. Yalnızca dönüş türüne göre farklılık gösteren fonksiyon bildirimlerini aşırı yükleyemezsiniz.
Aşağıda, farklı veri tiplerini yazdırmak için aynı olan print() fonksiyonu kullanılan örnek verilmiştir -
#include <iostream>
using namespace std;
class printData {
public:
void print(int i) {
cout << “int tipi yazdiriliyor: “ << i << endl;
}
void print(double f) {
cout << “float tipi yazdiriliyor: “ << f << endl;
}
void print(char* c) {
cout << “character tipi yazdiriliyor: “ << c << endl;
}
};
int main(void) {
printData pd;
// Tamsayı yazdırmak için print çağrılıyor
pd.print(5);
// float yazdırmak için print çağrılıyor
pd.print(500.263);
// Karakter yazdırmak için print çağrılıyor
pd.print(“Merhaba C++”);
return 0;
}
Kod derlenip çalıştırıldığında takip eden sonuç alınır -
int tipi yazdiriliyor: 5
float tipi yazdiriliyor: 500.263
character tipi yazdiriliyor:: Merhaba C++
Operator Aşırı Yüklemesi
C++’da bulunan yerleşik operator’lerin çoğunu yeniden tanımlayabilir veya aşırı yükleyebilirsiniz. Böylelikle, bir programcı kullanıcı tanımlı tiplere sahip operator’leri de kullanabilir.
Aşırı yüklenmiş operator’ler, özel adlara sahip fonksiyonlardır: “operator” anahtar kelimesi ardından tanımlanmakta olan operator için semboldür. Herhangi bir fonksiyonda olduğu gibi, aşırı yüklenmiş bir operator de parametre listesine ve dönüş tipine sahiptir.
Kutu operator+(const Kutu&);
İki Kutu nesnesi eklemek için kullanılabilecek toplama operator’ünü bildirir, ve son Kutu nesnesini döndürür. Aşırı yüklenmiş operator’lerin çoğu, üye olmayan sıradan fonksiyonlar veya sınıf üyesi fonksiyonlar olarak tanımlanabilir. Yukarıdaki fonksiyonu bir sınıfın üye olmayan fonksiyonu olarak tanımlamamız(bildirmemiz) durumunda, her operator için aşağıda olduğu gibi iki argüman iletmemiz gerekir -
Kutu operator+(const Kutu&, const Kutu&);
Takip eden örnekte, bir üye fonksiyonu kullanarak operator aşırı yükleme kavramı gösterilmiştir. Burada, özelliklerine bu nesne kullanılarak erişilecek bir nesne argüman olarak aktarılır, operator’ü çağıracak nesneye aşağıdaki gibi erişilir -
#include <iostream>
using namespace std;
class Kutu {
public:
double hacimHesapla(void) {
return uzunluk * genislik * yukseklik;
}
void uzunlukAyarla( double uz ) {
uzunluk = uz;
}
void genislikAyarla( double gen ) {
genislik = gen;
}
void yukseklikAyarla( double yuk ) {
yukseklik = yuk;
}
// + operator’ü ile 2 Kutu objesini aşırı yükleme aracılığıyla ekleme.
Kutu operator+(const Kutu& b) {
Kutu kutu;
kutu.uzunluk = this->uzunluk + b.uzunluk;
kutu.genislik = this->genislik + b.genislik;
kutu.yukseklik = this->yukseklik + b.yukseklik;
return kutu;
}
private:
double uzunluk; // kutu’nun uzunlugu
double genislik; // kutu’nun genisligi
double yukseklik; // kutu’nun yuksekligi
};
// Programın ana fonksiyonu
int main() {
Kutu Kutu1; // Kutu tipli Kutu1’in bildirimi
Kutu Kutu2; // Kutu tipli Kutu2’nin bildirimi
Kutu Kutu3; // Kutu tipli Kutu3’ün bildirimi
double hacim = 0.0; // Kutunun hacimini tutacak değişken
// Kutu 1 özelleştirimi
Kutu1.uzunlukAyarla(6.0);
Kutu1.genislikAyarla(7.0);
Kutu1.yukseklikAyarla(5.0);
// Kutu 2 özelleştirimi
Kutu2.uzunlukAyarla(12.0);
Kutu2.genislikAyarla(13.0);
Kutu2.yukseklikAyarla(10.0);
// Kutu1 hacmi
hacim = Kutu1.hacimHesapla();
cout << “Kutu1’in hacmi : “ << hacim <<endl;
// Kutu2 hacmi
hacim = Kutu2.hacimHesapla();
cout << “Kutu2’nin hacmi : “ << hacim <<endl;
// İki nesneyi takip eden şekilde topla
Kutu3 = Kutu1 + Kutu2;
// Kutu3 hacmi
hacim = Kutu3.hacimHesapla();
cout << “Kutu3’un hacmi : “ << hacim <<endl;
return 0;
}
Kod derlenip çalıştırıldığında, takip eden sonuç elde edilir -
Kutu1’in hacmi : 210
Kutu2’nin hacmi : 1560
Kutu3’un hacmi : 5400
Aşırı Yüklenebilen/Yüklenemeyen Operator’ler (Overloadable/Non-overloadable)
Aşırı yüklenebilen operator’ler:
Aşırı yüklenemeyenler:
Aşırı Yükleme Örnekleri
Daha iyi anlamanız için değinilecek örneklerden bazıları:
https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm