C++ Operator Overloading ve Friend Fonksiyonlar


C++ Operator Overloading ve Friend Fonksiyonlar

C++ operator overloading ve friend fonksiyonlar, nesne tabanlı programlama dünyasında güçlü ve esnek yaklaşımlar sunar. Operator overloading, C++'ta mevcut operatörlerin özel veri tipleri üzerinde anlamlı çalışmalarını sağlar. Friend fonksiyonlar ise kapsülleme ilkesini kontrollü bir şekilde esneterek bazı fonksiyonlara sınıfın özel üyelerine erişim hakkı tanır. Bu yazıda C++ operator overloading ve friend fonksiyonlar kavramlarını tüm detaylarıyla inceleyeceğiz.

Operator Overloading Nedir?

Operator overloading (operatör aşırı yükleme), var olan operatörlerin kullanıcı tanımlı veri tipleriyle beklenen şekilde davranmasını sağlar. Özellikle matematiksel işlemlerin anlamlı olması için kullanılır. Örneğin iki "Complex" (karmaşık sayı) nesnesini + operatörüyle toplamak mümkündür.

C++ Operator Overloading Kullanımı

#include <iostream>
using namespace std;

class Complex {
    double re, im;
public:
    Complex(double r, double i) : re(r), im(i) {}
    // '+' operatörünü aşırı yükleme
    Complex operator+(const Complex& other) const {
        return Complex(re + other.re, im + other.im);
    }
    void print() const {
        cout << re << "+i" << im << endl;
    }
};

int main() {
    Complex z1(2.0, 3.5), z2(1.5, 4.5);
    Complex sum = z1 + z2;
    sum.print();    // 3.5+i8
    return 0;
}

Bu örnekte C++ operator overloading sayesinde + operatörü ile iki Complex nesnesi kolayca toplanabiliyor.

Friend Fonksiyon (Arkadaş Fonksiyon) Nedir?

Friend fonksiyonlar, bir sınıfın özel (private) ve korumalı (protected) üyelerine erişebilen fonksiyonlardır. Genellikle operator overloading işlemlerinde, operatörün solunda nesne olmayan durumlar için friend fonksiyonlar kullanılır.

Friend Operator Overloading Örneği

#include <iostream>
using namespace std;

class Nokta {
    int x, y;
public:
    Nokta(int x, int y) : x(x), y(y) {}
    // friend fonksiyon ile '==' operatörü aşırı yükleniyor
    friend bool operator==(const Nokta& a, const Nokta& b);
};

bool operator==(const Nokta& a, const Nokta& b) {
    return a.x == b.x && a.y == b.y;
}

int main() {
    Nokta n1(2, 5), n2(2, 5);
    if(n1 == n2) {
        cout << "Noktalar eşit!" << endl;
    }
    return 0;
}

Yukarıdaki örnekte friend fonksiyon, operator overloading ile birlikte kullanılarak nesnelerin karşılaştırılması sağlanmıştır.

Sonuç

C++ operator overloading ve friend fonksiyonlar, nesne tabanlı programlamada hem okunabilirlik hem de kullanım kolaylığı sağlar. Bu yöntemler ile kendi veri tipleriniz üzerinde doğal operatör davranışını sağlayabilir, friend fonksiyonlar ile özel erişim gerektiren senaryolarda esnek çözümler üretebilirsiniz. C++ operator overloading ve friend fonksiyonlar, yazılım geliştirmede büyük avantajlar sunar ve doğru kullanıldığında kodunuzu daha anlaşılır hale getirir.