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ı yaparTü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.
Görev
Kolay2D 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 deint) saklayan birPointsı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()vegetY()alıcıları (her ikisi de const)- İki noktayı toplayan ve birleşik koordinatlara sahip yeni bir
Pointdöndüren aşırı yüklenmiş bir+operatörü
+operatörü, başka birPointnesnesini const referans olarak alan ve yeni birPointdöndüren bir üye fonksiyon olarak uygulanmalıdır. Her iki işleneni de değiştirmediği için bunuconstolarak işaretleyin.main.cpp: İki noktayı temsil eden dört tam sayıyı (ayrı satırlarda x1, y1, x2, y2) girdiden okuyun. İkiPointnesnesi 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ırBazı 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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner