Davut KARA

Bilişim Sistemleri Mühendisi

Bu blog, 5 yıl önce, bilişim ve diğer konularda hakkında, makalelerime yer vermek amacı ile açılmıştır.

Compe 225 | C++ Ders 14 Operator Overloading Nedir ?

C++ Banner(Çok ilginç bir noktadayız, operatörleri tanımsız olan işlemler için tanımlı hale getiriyoruz..)

Bildiğimiz üzere overloading işlemi , tanımlı bir function a yeni özellikler kazandırmaktı bu konudada özetle anlatacak olursam.

Mesela + operatörünü düşünün bu operatör int ile inti toplar int ile double ı toplar int ile bool u toplar int ile char ı toplar ve geriye bir sayısal değer return eder. Çünkü görevi toplamaktır. Ama bu + operatör iki objeyi toplayamaz çünkü bizim objemizin class ı bir data_type ı dır. Dolaıyısyla biz de bu + operatörünü kendi ayarlayacağımız şekilde overload ederek class larımızı toplattırabiliriz, veya her ne istiyorsak yapabiliriz. Tüm operatörler overload edilebilir.

Aşağıya çok yalın bir örnek yazdım.

#include <iostream>

class Islem{
	public:
		int sayi = 0;
		Islem(int n):sayi(n){}
		operator += (Islem &obj){
			this->sayi  =  this->sayi + obj.sayi;
			//veya this->sayi += obj.sayi;
		}
};

int main(void){
	Islem objem1(5);
	Islem objem2(7);
	objem1 += objem2;
	std::cout << objem1.sayi;
	return 0;
}

Kalın olarak yaptığım yerlerdeki syntax(yazım kuralı, yazma şekli) ı inceleyin, Mantık basit

Function yazar gibi operator yazıp overloading yapmak istediğimiz operatörü yazıyoruz, ben burda += üzerine ekleme işlevi gören operatörü seçtim ama istediğim operaötürüde seçebilirdim mesela – seçerim ama içerde yine aynı işlemi yaparım toplama yapar.

Şimdi yukardaki örnekte 2 adet objeyi birbiri ile topladık, ancak 1i obje diğeri fonksiyon olsaydı nasıl bir overloading işlemi yapardık.

Mesela, cout bir fonksiyon ve << şeklinde bir operatörü var, biz objemizi ekrana yazdırmak istesek şu şekilde. cout<<objem1 işte bu durumda operatörün bir tarafı objeyken diğer tarafı fonksiyon olduğu için overloadingi dışarda yapıp friend kullnarak classımıza dahil etmemiz gerekiyor, onuda şu örnekle anlayabilirz.

#include <iostream>
class Islem{
	public:
		int sayi = 0;
		Islem(int n):sayi(n){}
		operator += (Islem &obj){
			this->sayi  =  this->sayi + obj.sayi;
			//veya this->sayi += obj.sayi;
		}
		friend std::ostream& operator << (std::ostream &m,Islem obj);
};
std::ostream& operator << (std::ostream &m, Islem &obj){
	std::cout << obj.sayi;
	return m;
}
int main(void){
	Islem objem1(5);
	Islem objem2(7);
	objem1 += objem2;
	std::cout << objem1;
	return 0;
}

Oldukça karışık göründüğünün farındayım öncelikle ostream bir data type ı ve iostream kütüphanesi ile ilişkili burada ben başa using namespace std yazsaydım std:: lerin hepsini kaldırıncada çalışacaktı. Ama karışık dursun diye böyle yaptım.

Ostream bir data type geriye cout return ediyor.

Şimdi std::ostream& kısımlarını koddan kaldırıp onun yerine bir şey return etmesek ve void yazsaydık, örnek ayn şekilde çalışırdı ancak std::cout << objem1 << “abc”; kodunu çalıştırmaya kalktığımızda std::cout << objem1 kısmında yukarda paint ile çizdiğim örnekteki mantık gibi void döneceği iin devamında void << “abc” gibi bir saçmalık oluşacaktı ve abc yazılamayacaktı. O yüzden biz cout u tekrar return edioruz

Buraya kadarda tamamsa şimdi operatör << kısmını yazdık bunu zaten biliyoruz.

Ve parametre kısmına sol tarafa << kısmının sol tarafında kalan cout fonksiyonun data type ı olan ostream i yazdık adresini almak için & koyduk m ismini verdik, ve işlemlerimizi yazıp tekrar return ettik.