C++ Operator Overloading
Operator overloading, halihazırda bulunan operatorlere yeni anlamlar yüklemek için yazılan operator fonksiyonlardır. C++ dilinin esnek olmasını sağlayan özelliklerden birisi olan bu işlem, kendi yazdığımız tipler için implement edilir. Örnek verecek olursak;
’+’ operatoru iki tane int değeri toplarken;
int a=5, b=3, ;
c = a + b;
şeklinde çalışır. + operatoru, a üzerinden b parametresini alarak çalışan bir fonksiyon gibi davranır. Yani ;
a + b ifadesi a.operator+( b ) ifadesine eşittir.
Peki + operatoru bizim object lerimiz üzerinde çalışırken nasıl çalışacaklar, hangi değerleri nasıl toplayacaklar, neyi nereye atıyacaklar ? Şimdi bir örnekle inceleyelim.
1 Adı Coordinate olan bir tane classımız olsun. ( Bilindiği üzere koordinat düzleminde bir noktayı belirtmek için x ve y olmak üzere iki tane integer değer tutmamız gerekecek. )
2 Bu Coordinate classının headerı basit olarak şu şekilde olsun :
class Coordinate {
public:
.......
private:
int x;
int y;
};
3 Main fonksiyonunda iki tane Coordinate object’ini toplamak istediğimiz zaman + operatoru hangi değerleri ne şekilde toplayacağını bilemez. Çünkü toplaması gereken 4 tane değer mevcuttur. İşte bunun için Coordinate object’lerimizi toplarken + operatorunu overload etmemiz gerekecek.
4 Header dosyasında, class Coordinate içerisindeki public kısımda + operatorunun prototype’nı yazıyoruz.
Coordinate &operator+( const Coordinate & );
5 Daha sonra implementation dosyamızda bu fonksiyonu overload ediyoruz.
Coordinate &Coordinate::operator+( const Coordinate &myCoor )
{
Coordinate *tempCoor = new Coordinate(); // allocate tempCoor
tempCoor.x = x + myCoor.x ; // addition of x values
tempCoor.y = y + myCoor.y; // addition of y values
return *tempCoor; // return addition
}
6 Yukarıdaki kodu inceleyecek olursak;
- Fonksiyonun referans döndermesi ard arda toplama işlemi yapabilmek içindir.
Örn : myCoor1 + myCoor2 + myCoor3;
- Parametrenin const olması değiştirilmeyeceği manasına geliyor ki zaten değiştirilmiyor. Ayrıca referans olması da data memberlarına nokta operatoru ile erişebilmesi içindir.
- Son olarak da return *tempCoor ifadesi toplamları dönderir.
Basit olarak bir operator overload işlemi bu şekilde yapılıyor. Birkaç istisnası var.
1 Nokta(.), nokta-yıldız (.*), ternary conditional ( ? : ) ve binary resolution ( :: ) operatorleri overload edilemiyor.
2 Var olmayan bir operator yaratılamıyor.
3 Operator öncelikleri değiştirilemiyor.
4 Kendiliğinden overload edilen default operatorler mevcuttur. Bunlar atama ( = ), adres ( & ), yıldız ( * ) ve virgül ( , ) operatorleridir. ( Eğer data member değerlerimiz pointer veya array ise bu operatorlerin de overload edilmesi daha sağlıklı olur. )
’+’ operatoru iki tane int değeri toplarken;
int a=5, b=3, ;
c = a + b;
şeklinde çalışır. + operatoru, a üzerinden b parametresini alarak çalışan bir fonksiyon gibi davranır. Yani ;
a + b ifadesi a.operator+( b ) ifadesine eşittir.
Peki + operatoru bizim object lerimiz üzerinde çalışırken nasıl çalışacaklar, hangi değerleri nasıl toplayacaklar, neyi nereye atıyacaklar ? Şimdi bir örnekle inceleyelim.
1 Adı Coordinate olan bir tane classımız olsun. ( Bilindiği üzere koordinat düzleminde bir noktayı belirtmek için x ve y olmak üzere iki tane integer değer tutmamız gerekecek. )
2 Bu Coordinate classının headerı basit olarak şu şekilde olsun :
class Coordinate {
public:
.......
private:
int x;
int y;
};
3 Main fonksiyonunda iki tane Coordinate object’ini toplamak istediğimiz zaman + operatoru hangi değerleri ne şekilde toplayacağını bilemez. Çünkü toplaması gereken 4 tane değer mevcuttur. İşte bunun için Coordinate object’lerimizi toplarken + operatorunu overload etmemiz gerekecek.
4 Header dosyasında, class Coordinate içerisindeki public kısımda + operatorunun prototype’nı yazıyoruz.
Coordinate &operator+( const Coordinate & );
5 Daha sonra implementation dosyamızda bu fonksiyonu overload ediyoruz.
Coordinate &Coordinate::operator+( const Coordinate &myCoor )
{
Coordinate *tempCoor = new Coordinate(); // allocate tempCoor
tempCoor.x = x + myCoor.x ; // addition of x values
tempCoor.y = y + myCoor.y; // addition of y values
return *tempCoor; // return addition
}
6 Yukarıdaki kodu inceleyecek olursak;
- Fonksiyonun referans döndermesi ard arda toplama işlemi yapabilmek içindir.
Örn : myCoor1 + myCoor2 + myCoor3;
- Parametrenin const olması değiştirilmeyeceği manasına geliyor ki zaten değiştirilmiyor. Ayrıca referans olması da data memberlarına nokta operatoru ile erişebilmesi içindir.
- Son olarak da return *tempCoor ifadesi toplamları dönderir.
Basit olarak bir operator overload işlemi bu şekilde yapılıyor. Birkaç istisnası var.
1 Nokta(.), nokta-yıldız (.*), ternary conditional ( ? : ) ve binary resolution ( :: ) operatorleri overload edilemiyor.
2 Var olmayan bir operator yaratılamıyor.
3 Operator öncelikleri değiştirilemiyor.
4 Kendiliğinden overload edilen default operatorler mevcuttur. Bunlar atama ( = ), adres ( & ), yıldız ( * ) ve virgül ( , ) operatorleridir. ( Eğer data member değerlerimiz pointer veya array ise bu operatorlerin de overload edilmesi daha sağlıklı olur. )