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;

şeklinde çalışır. + operatoru, a üzerinden b parametresini alarak çalışan bir fonksiyon gibi davranır.

Yani ;

 

Peki ‘+’ operatoru bizim nesnelerimiz üzerinde çalışırken nasıl çalışacaklar, hangi değerleri nasıl toplayacaklar, neyi nereye atıyacaklar ? Şimdi bir örnekle inceleyelim.

Adı Coordinate olan bir tane sınıfı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. )

Bu Coordinate sınıfının headerı basit olarak şu şekilde olsun :

Main fonksiyonunda iki tane Coordinate nesnesini 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.

Header dosyasında, class Coordinate içerisindeki public kısımda + operatorunun prototype’nı yazıyoruz.

Daha sonra implementation dosyamızda bu fonksiyonu overload ediyoruz.

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. )