Menu
Coddy logo textTech

Operatör Aşırı Yüklemeye Giriş

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 40 / 104.

Operatör aşırı yüklemesi, +, - veya == gibi operatörlerin özel sınıflarınızla kullanıldığında nasıl davranacağını tanımlamanıza olanak tanır. a.add(b) gibi metotları çağırmak yerine, daha sezgisel olan a + b yazabilirsiniz.

C++'da operatörler, esasen özel adlara sahip fonksiyonlardır. Bir operatörü aşırı yüklemek için, operator anahtar kelimesini ve ardından sembolü kullanarak bir fonksiyon tanımlarsınız:

class Vector2D {
    double x, y;
    
public:
    Vector2D(double x, double y) : x(x), y(y) {}
    
    // + operatörünü aşırı yükle
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }
};

Artık iki vektörü doğal bir şekilde toplayabilirsiniz:

Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2;    // v1.operator+(v2) çağrısını yapar

Tüm operatörler aşırı yüklenemez. Kapsam çözünürlük operatörü ::, üye erişimi ., üçlü ?: ve sizeof aşırı yüklenemez. Ayrıca, yeni operatörler oluşturamazsınız veya bir operatörün önceliğini değiştiremezsiniz - * her zaman + operatöründen önce değerlendirilecektir.

Operatörler, üye fonksiyonlar (yukarıdaki gibi) veya üye olmayan fonksiyonlar olarak gerçeklenebilir. Gelecek derslerde, her bir yaklaşımın ne zaman kullanılacağını ve belirli operatör kategorilerinin nasıl aşırı yükleneceğini öğreneceksiniz.

challenge icon

Görev

Kolay

2D bir koordinatı temsil eden ve + operatörünü kullanarak iki noktayı toplamayı destekleyen bir Point sınıfı oluşturalım. Bu, operatör aşırı yükleme (operator overloading) konusuna ilk adımınızdır — özel sınıflarınızın tanıdık operatörlerle çalışmasını sağlar.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Point.h: x ve y koordinatlarını (her ikisi de int) saklayan bir Point sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • x ve y koordinatları için özel (private) üyeler
    • x ve y değerlerini alan bir yapıcı (constructor)
    • getX() ve getY() alıcıları (her ikisi de const)
    • İki noktayı toplayan ve birleşik koordinatlara sahip yeni bir Point döndüren aşırı yüklenmiş bir + operatörü

    + operatörü, başka bir Point nesnesini const referans olarak alan ve yeni bir Point döndüren bir üye fonksiyon olarak uygulanmalıdır. Her iki işleneni de değiştirmediği için bunu const olarak işaretleyin.

  • main.cpp: İki noktayı temsil eden dört tam sayıyı (ayrı satırlarda x1, y1, x2, y2) girdiden okuyun. İki Point nesnesi oluşturun, bunları + operatörünü kullanarak toplayın ve sonuçları görüntüleyin.

    Çıktı formatı:

    Point 1: (<x1>, <y1>)
    Point 2: (<x2>, <y2>)
    Sum: (<sum_x>, <sum_y>)

Buradaki temel fikir, p1 + p2 ifadesinin aslında arka planda p1.operator+(p2) fonksiyonunu çağırıyor olmasıdır. Aşırı yüklenmiş operatörünüz, Point p3 = p1.add(p2); gibi bir şey yerine Point p3 = p1 + p2; gibi sezgisel kodlar yazmanıza olanak tanır.

Girdi dizelerini std::stoi() kullanarak tam sayılara dönüştürün. Başlık dosyanızda header guard (başlık koruyucuları) kullanmayı unutmayın.

Kopya kağıdı

Operatör aşırı yükleme (operator overloading), +, - veya == gibi operatörlerin özel sınıflarla nasıl davranacağını tanımlamanıza olanak tanıyarak, a.add(b) yerine a + b gibi sezgisel bir sözdizimi sağlar.

Bir operatörü aşırı yüklemek için, operator anahtar kelimesini ve ardından sembolü kullanarak bir fonksiyon tanımlayın:

class Vector2D {
    double x, y;
    
public:
    Vector2D(double x, double y) : x(x), y(y) {}
    
    // + operatörünü aşırı yükle
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }
};

Kullanım:

Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2;    // v1.operator+(v2) fonksiyonunu çağırır

Bazı operatörler aşırı yüklenemez: ::, ., ?: ve sizeof. Yeni operatörler oluşturamazsınız veya operatör önceliğini değiştiremezsiniz.

Operatörler, üye fonksiyonlar veya üye olmayan fonksiyonlar olarak uygulanabilir.

Kendin dene

#include <iostream>
#include <string>
#include "Point.h"

using namespace std;

int main() {
    // Girdiyi oku
    string line1, line2, line3, line4;
    getline(cin, line1);
    getline(cin, line2);
    getline(cin, line3);
    getline(cin, line4);

    int x1 = stoi(line1);
    int y1 = stoi(line2);
    int x2 = stoi(line3);
    int y2 = stoi(line4);

    // TODO: Giriş değerlerini kullanarak iki Point nesnesi oluşturun

    // TODO: + operatörünü kullanarak iki noktayı birbirine ekleyin

    // TODO: Sonuçları istenen formatta çıktı olarak verin:
    // Point 1: (<x1>, <y1>)
    // Point 2: (<x2>, <y2>)
    // Sum: (<sum_x>, <sum_y>)

    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler