Operator Overloading: Kendi Sınıflarında Aritmetik İşlemler Tanımlama
# Operator Overloading: Kendi Sınıflarında Aritmetik İşlemler Tanımlama
Kendi oluşturduğun sınıflara `+`, `-`, `*` gibi işlemleri öğretmek istesen ne yapardın? bunu sağlayan mekanizmaya operator overloading deniyor. Mesela iki `Kompleks` sayıyı toplaman gerekiyorsa, C++ sana bu işlemi tanımlama şansı veriyor.
Operatör overloading için `operator` anahtar kelimesini kullanırsın. Hangi işlemi tanımlamak istiyorsan onun sembolünü yazarsın. Örneğin toplama için `operator+`.
İki yöntem vardır:
1. Üye fonksiyon (member function): Sınıfın içinde tanımlarsın
2. Arkadaş fonksiyon (friend function): Sınıfın dışında ama erişim hakkı olan fonksiyon
Kompleks sayılar (gerçek + sanal bölüm) için toplama işlemi tanımlayalım:
1#include <iostream>2using namespace std;34class Kompleks {5public:6double reel, sanal;78Kompleks(double r = 0, double s = 0): reel(r), sanal(s) {}910// Toplama operatörünü tanımla11Kompleks operator+(const Kompleks& diger) {12return Kompleks(reel + diger.reel, sanal + diger.sanal);13}1415// Çıkarma operatörünü tanımla16Kompleks operator-(const Kompleks& diger) {17return Kompleks(reel - diger.reel, sanal - diger.sanal);18}1920void yazdir() {21cout << reel << " + " << sanal << "i" << endl;22}23};2425int main() {26Kompleks z1(3, 4); // 3 + 4i27Kompleks z2(1, 2); // 1 + 2i2829Kompleks toplam = z1 + z2; // Operator+ çağrılır30Kompleks fark = z1 - z2; // Operator- çağrılır3132cout << "Toplam: ";33toplam.yazdir(); // Çıktı: 4 + 6i3435cout << "Fark: ";36fark.yazdir(); // Çıktı: 2 + 2i3738return 0;39}Beklenen Çıktı:
1Toplam: 4 + 6i2Fark: 2 + 2i- `operator+` bir fonksiyon gibi davranır, yalnız `+` sembolü ile çağrılır
- Parametreyi `const` yap, böylece orijinal nesne değişmez
- Genellikle yeni bir nesne döndürürsün (z1 + z2 sonucu yeni bir Kompleks)
- `operator=`, `operator[]`, `operator()` gibi diğer operatörleri de benzer şekilde tanımlayabilirsin
Operator overloading, kodunu daha doğal ve okunaklı kılar. Matematiksel nesnelerle çalışırken özellikle kullanışlıdır.
0 yorum