C++ Operator Overloading (Artırma, Karşılaştırma vb.)
C++’ta operator overloading kullanımını öğrenin. Aritmetik, karşılaştırma ve özel operatörleri sınıflarınız için tanımlamayı keşfedin.
C++ dilinde operator overloading (operatör aşırı yükleme),
özel sınıf türleri için standart operatörlerin (+, ==, <, << vb.)
yeniden tanımlanmasına olanak tanır.
Bu özellik sayesinde sınıf nesneleri tıpkı yerleşik türler (int, double gibi) gibi davranabilir.
Bu makalede Book sınıfı üzerinden aritmetik, karşılaştırma ve akış (stream) operatörlerini uygulamalı şekilde inceleyeceğiz.
1. Operatör Aşırı Yükleme Nedir?
Operatör overloading, bir sınıfa özel davranış kazandırmak için kullanılır.
Örneğin iki Book nesnesini + ile birleştirmek veya
iki kitabı == ile karşılaştırmak mümkündür.
Operatör fonksiyonları normal üye fonksiyonlar gibi tanımlanır:
class SınıfAdı {
public:
DönüşTipi operator<Operatör>(Parametreler) {
// özel davranış
}
};
Örneğin Book operator+(const Book& other)
ifadesi, iki Book nesnesinin + operatörünü desteklediği anlamına gelir.
2. Book Sınıfı Temeli
Aşağıdaki sınıf, kitap nesnelerini fiyat, başlık ve sayfa sayısı üzerinden temsil eder. Bu örnek üzerine farklı operatörleri tanımlayacağız.
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
double price;
int pages;
public:
Book(string t = "", double p = 0.0, int pg = 0)
: title(t), price(p), pages(pg) {}
void Show() const {
cout << "Kitap: " << title
<< " | Sayfa: " << pages
<< " | Fiyat: " << price << " TL" << endl;
}
// Getter'lar
double GetPrice() const { return price; }
int GetPages() const { return pages; }
string GetTitle() const { return title; }
};
3. + Operatörü (İki Kitabı Birleştirme)
İki kitabı + ile topladığımızda yeni bir “paket” kitap oluşturmak isteyelim.
Yeni kitap fiyatı iki kitabın toplamı, sayfa sayısı ise toplam sayfa sayısı olsun.
Book operator+(const Book &other) const {
string combinedTitle = title + " & " + other.title;
double combinedPrice = price + other.price;
int combinedPages = pages + other.pages;
return Book(combinedTitle, combinedPrice, combinedPages);
}
Kullanımı:
Book b1("C++ Primer", 180.0, 980);
Book b2("Effective C++", 150.0, 400);
Book combo = b1 + b2;
combo.Show();
Çıktı:
Kitap: C++ Primer & Effective C++
| Sayfa: 1380 | Fiyat: 330 TL
4. == Operatörü (Eşitlik Karşılaştırması)
İki kitabın aynı olup olmadığını kontrol etmek için == operatörünü tanımlayabiliriz.
Örneğin başlık ve yazar aynıysa “eşit” kabul edelim.
bool operator==(const Book &other) const {
return (title == other.title &&
pages == other.pages &&
price == other.price);
}
Kullanımı:
Book a("1984", 99.9, 328);
Book b("1984", 99.9, 328);
if (a == b)
cout << "Kitaplar aynı." << endl;
else
cout << "Farklı kitaplar." << endl;
Çıktı:
Kitaplar aynı.
5. < Operatörü (Karşılaştırma)
Kitapların fiyatına göre karşılaştırma yapmak için < operatörünü tanımlayabiliriz.
Bu operatör özellikle std::sort() veya std::set gibi yapılar tarafından kullanılır.
bool operator<(const Book &other) const {
return price < other.price;
}
Kullanımı:
Book b1("C++ Primer", 180, 900);
Book b2("Clean Code", 220, 500);
if (b1 < b2)
cout << b1.GetTitle() << " daha ucuz." << endl;
Çıktı:
C++ Primer daha ucuz.
6. ++ Operatörü (Sayfa Sayısını Artırma)
++ operatörünü prefix (ön ek) ve postfix (son ek) olarak iki farklı biçimde tanımlayabiliriz. Bu örnekte ++ işlemi kitabın sayfa sayısını artırır.
// Prefix (++kitap)
Book& operator++() {
++pages;
return *this;
}
// Postfix (kitap++)
Book operator++(int) {
Book temp = *this;
pages++;
return temp;
}
Kullanımı:
Book b("C++ 101", 120.0, 250);
++b; // prefix
b++; // postfix
b.Show(); // 252 sayfa
7. << Operatörü (ostream ile Yazdırma)
cout << b; ifadesiyle nesneyi doğrudan yazdırmak istiyorsak
<< operatörünü global olarak overload etmemiz gerekir.
Bu operatör genellikle ostream& döndürür.
friend ostream& operator<<(ostream &os, const Book &b) {
os << "[Kitap: " << b.title
<< ", Sayfa: " << b.pages
<< ", Fiyat: " << b.price << " TL]";
return os;
}
Kullanımı:
Book b("Clean Architecture", 175.0, 350);
cout << b << endl;
Çıktı:
[Kitap: Clean Architecture, Sayfa: 350, Fiyat: 175 TL]
8. Tam Örnek: Tüm Operatörlerin Bir Arada Kullanımı
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
double price;
int pages;
public:
Book(string t = "", double p = 0, int pg = 0)
: title(t), price(p), pages(pg) {}
// + operatörü
Book operator+(const Book &other) const {
return Book(title + " & " + other.title,
price + other.price,
pages + other.pages);
}
// == operatörü
bool operator==(const Book &other) const {
return (title == other.title && price == other.price);
}
// < operatörü
bool operator<(const Book &other) const {
return price < other.price;
}
// ++ (prefix)
Book& operator++() {
++pages;
return *this;
}
// ++ (postfix)
Book operator++(int) {
Book temp = *this;
pages++;
return temp;
}
// << (ostream)
friend ostream& operator<<(ostream &os, const Book &b) {
os << b.title << " - " << b.price << " TL (" << b.pages << " sayfa)";
return os;
}
};
int main() {
Book b1("C++ Primer", 180.0, 900);
Book b2("Effective C++", 150.0, 400);
Book combo = b1 + b2; // +
cout << combo << endl; // <<
++combo; // prefix ++
combo++; // postfix ++
cout << "Sayfa sonrası: " << combo << endl;
cout << (b1 < b2 ? "b1 daha ucuz" : "b2 daha ucuz") << endl;
if (b1 == b2)
cout << "Kitaplar aynı." << endl;
else
cout << "Farklı kitaplar." << endl;
}
Çıktı:
C++ Primer & Effective C++ - 330 TL (1300 sayfa)
Sayfa sonrası: C++ Primer & Effective C++ - 330 TL (1302 sayfa)
b1 daha ucuz
Farklı kitaplar.
9. TL;DR
- operator+ → İki nesneyi birleştirmek için.
- operator== → Eşitlik karşılaştırması için.
- operator< → Sıralama veya karşılaştırma için.
- operator++ → Artırma işlemleri (prefix/postfix).
- operator<< →
coutile kolay yazdırma için (friend gerekir). - Operatör overloading, sınıfları “yerleşik tipler gibi” kullanılabilir hale getirir.
- Tüm örnekler Visual Studio 2022 veya GCC 11+ ortamında çalıştırılabilir.