Operator overloading, standart operatörlerin (örneğin, +, -, *, ==) kullanıcı tanımlı davranışını kendi sınıflarınız için tanımlama yeteneğidir. Bu, kullanıcı tanımlı türlerle (örneğin, vektör, matris) çalışırken ifade edici ve okunabilir bir kod yazmanıza yardımcı olur.
Operatör overload mekanizması, C++'ta nesnelerle (örneğin, karmaşık sayıların toplanması, iteratorlarla çalışma) temel türlerle aynı şekilde sezgisel bir sözdizimini desteklemek için ortaya çıkmıştır.
Operator overload olmadan birçok işlem, normal fonksiyonlar gibi görünürdü (add(a, b)), bu da kodun okunmasını zorlaştırır ve ifade gücünü düşürür. Ancak aşırı veya yanlış kullanım, kafa karışıklığına ve hatalara yol açar.
C++'ta, yeni işlemler için mantığı tanımlamak amacıyla uygun üyelik fonksiyonları veya dost fonksiyonlar bildirerek çoğu operatörü overloda edebilirsiniz.
Kod örneği:
class Vector2D { double x, y; public: Vector2D(double x, double y) : x(x), y(y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
Anahtar özellikler:
. (nokta) ve :: (iki noktası) operatörlerini overload edebilir miyiz?
Hayır, . (nokta), ::, sizeof, ?: ve bazı diğerleri gibi operatörler, dil standartları gereği overload edilemez.
Overloaded operatörlerin davranışı standart semantik ile tamamen örtüşmek zorunda mı?
Zorunda değil, ancak önerilir (örneğin, == overload ederken eşitlik karşılaştırması yapmak).
Overloaded bir operatöre değeri yanlış geçerseniz ne olur?
Gereksiz kopyalar veya dereferanslar alabilirsiniz, bu da programı yavaşlatır veya hataya neden olur. Sabit bir referans (const T&) ile geçmek daha iyidir.
Kod örneği:
Vector2D operator+(Vector2D rhs) const; // verimsiz, nesne kopyalanıyor
DataFrame sınıfında, nesnenin değiştirilmesiyle yan etkisi olan skalar çarpım için * operatörünü overload ettik.
Artıları:
Eksileri:
Karmaşık sayılar sınıfında, +, -, == operatörleri alışılmış matematiksel mantıkla, nesnelerin değiştirilmesi olmadan overload edildi.
Artıları:
Eksileri: