Bu eğitimde, örnekler yardımıyla operatör aşırı yüklemesini öğreneceğiz.
C ++ 'da, operatörlerin nesneler ve yapılar gibi kullanıcı tanımlı tipler için çalışma şeklini değiştirebiliriz. Bu, operatörün aşırı yüklenmesi olarak bilinir . Örneğin,
Üç tane c1, c2 nesnesi oluşturduğumuzu ve Complex
karmaşık sayıları temsil eden bir sınıftan elde ettiğimizi varsayalım .
Operatör aşırı yükleme, operatörlerin çalışma şeklini değiştirmemize izin verdiğinden, +
operatörün nasıl çalıştığını yeniden tanımlayabilir ve aşağıdaki kodu yazarak c1 ve c2 karmaşık sayılarını eklemek için kullanabiliriz:
result = c1 + c2;
gibi bir şey yerine
result = c1.addNumbers(c2);
Bu, kodumuzu sezgisel ve anlaşılması kolay hale getirir.
Not: Biz gibi temel veri türleri için aşırı operatörünü kullanamazsınız int
, float
, char
vb.
C ++ Operatör Aşırı Yüklemesi için Sözdizimi
Bir operatörü aşırı yüklemek için özel bir operator
işlev kullanıyoruz.
class className (… public returnType operator symbol (arguments) (… )… );
Buraya,
returnType
işlevin dönüş türüdür.- operatör bir anahtar kelimedir.
symbol
aşırı yüklemek istediğimiz operatör. Gibi:+
,<
,-
,++
, vbarguments
işleve iletilen argümanlardır.
Tekli Operatörlerde Operatör Aşırı Yüklemesi
Tekli operatörler yalnızca bir işlenen üzerinde çalışır. Arttırma operatörü ++
ve eksiltme operatörü --
, tekli operatörlere örnektir.
Örnek1: ++ Operatör (Tek Operatör) Aşırı Yükleme
// Overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ ()" function ++count1; count1.display(); return 0; )
Çıktı
Sayı: 6
Kullandığımız zaman Burada ++count1;
, void operator ++ ()
denir. Bu, nesne sayımı için değer özniteliğini 1 artırır.
Not: Operatörleri aşırı yüklediğimizde, onu istediğimiz şekilde çalışmak için kullanabiliriz. Örneğin, ++
değeri 100 artırabilirdik.
Ancak bu, kodumuzu kafa karıştırıcı ve anlaşılmasını zorlaştırır. Operatör aşırı yüklemesini doğru ve tutarlı ve sezgisel bir şekilde kullanmak bir programcı olarak bizim işimiz.
Yukarıdaki örnek yalnızca ++
bir önek olarak kullanıldığında işe yarar. Yapmak için ++
bu sözdizimini kullanın uzantısına olarak iş.
void operator ++ (int) ( // code )
int
Parantezlerin içine dikkat edin . Sonek olarak tekli operatörleri kullanmak için kullanılan sözdizimidir; bu bir işlev parametresi değildir.
Örnek 2: ++ Operatör (Tek Operatör) Aşırı Yükleme
// Overload ++ when used as prefix and postfix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) // Overload ++ when used as postfix void operator ++ (int) ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ (int)" function count1++; count1.display(); // Call the "void operator ++ ()" function ++ count1; count1.display(); return 0; )
Çıktı
Sayı: 6 Sayı: 7
Örnek 2 çalışır ++
öneki ve uzantısına hem olarak kullanılır. Ancak, böyle bir şey yapmaya çalışırsak işe yaramaz:
Count count1, result; // Error result = ++count1;
Bunun nedeni, operatör işlevimizin dönüş türünün olmasıdır void
. Bu problemi Count
, operatör fonksiyonunun dönüş tipini yaparak çözebiliriz .
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Örnek 3: Operatör Fonksiyonundan Dönüş Değeri (++ Operatör)
#include using namespace std; class Count ( private: int value; public : // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) // Overload ++ when used as postfix Count operator ++ (int) ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1, result; // Call the "Count operator ++ ()" function result = ++count1; result.display(); // Call the "Count operator ++ (int)" function result = count1++; result.display(); return 0; )
Çıktı
Sayı: 6 Sayı: 7
Burada, önek operatörü aşırı yüklemesi için aşağıdaki kodu kullandık:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
Postfix operatörü aşırı yüklemesinin kodu da aynıdır. Bir nesne temp oluşturduğumuza ve değerini operatör işlevine döndürdüğümüze dikkat edin.
Ayrıca koda dikkat edin
temp.value = ++value;
Değişken değeri, içindeki count1 nesnesine aittir main()
çünkü count1 işlevi çağırır, temp.value ise temp nesnesine aittir.
İkili Operatörlerde Operatör Aşırı Yüklemesi
İkili operatörler iki işlenen üzerinde çalışır. Örneğin,
result = num + 9;
Burada, +
num ve işlenenleri üzerinde çalışan bir ikili operatördür 9
.
Kodu kullanarak kullanıcı tanımlı türler için ikili operatörü aşırı yüklediğimizde:
obj3 = obj1 + obj2;
Operatör işlevi, obj1 nesnesi kullanılarak çağrılır ve obj2, işleve argüman olarak iletilir.
Örnek 4: C ++ İkili Operatör Aşırı Yüklemesi
// C++ program to overload the binary operator + // This program adds two complex numbers #include using namespace std; class Complex ( private: float real; float imag; public: // Constructor to initialize real and imag to 0 Complex() : real(0), imag(0) () void input() ( cout <> real; cin>> imag; ) // Overload the + operator Complex operator + (const Complex& obj) ( Complex temp; temp.real = real + obj.real; temp.imag = imag + obj.imag; return temp; ) void output() ( if (imag < 0) cout << "Output Complex number: " << real << imag << "i"; else cout << "Output Complex number: " << real << "+" << imag << "i"; ) ); int main() ( Complex complex1, complex2, result; cout << "Enter first complex number:"; complex1.input(); cout << "Enter second complex number:"; complex2.input(); // complex1 calls the operator function // complex2 is passed as an argument to the function result = complex1 + complex2; result.output(); return 0; )
Çıktı
İlk karmaşık sayıyı girin: Sırasıyla gerçek ve sanal bölümleri girin: 9 5 İkinci karmaşık sayıyı girin: Sırasıyla gerçek ve sanal bölümleri girin: 7 6 Çıktı Karmaşık sayı: 16 + 11i
Bu programda operatör işlevi şöyledir:
Complex operator + (const Complex& obj) ( // code )
Bunun yerine, bu işlevi şöyle de yazabilirdik:
Complex operator + (Complex obj) ( // code )
Ancak,
- kullanmak
&
, operatör işlevi içinde yinelenen bir nesne yapmak yerine karmaşık2 nesnesine başvurarak kodumuzu verimli hale getirir. - kullanarak
const
o complex2 değiştirmesini operatör fonksiyonunu önlediğinden iyi bir uygulama olarak kabul edilir.

C ++ Operatör Aşırı Yüklemesinde Hatırlanması Gereken Şeyler
- İki operatör
=
ve&
C ++ 'da varsayılan olarak zaten aşırı yüklenmiştir. Örneğin, aynı sınıftaki nesneleri kopyalamak için doğrudan=
operatörü kullanabiliriz . Bir operatör fonksiyonu oluşturmamıza gerek yoktur. - Operatör aşırı yükleme, operatörlerin önceliğini ve ilişkisini değiştiremez. Bununla birlikte, değerlendirme sırasını değiştirmek istiyorsak parantez kullanılmalıdır.
- C ++ 'da aşırı yüklenemeyen 4 operatör vardır. Onlar:
::
(kapsam çözümü).
(üye seçimi).*
(işleve işaretçi aracılığıyla üye seçimi)?:
(üçlü operatör)
Daha fazla bilgi edinmek için şu sayfaları ziyaret edin:
- Arttırma operatörü doğru şekilde nasıl aşırı yüklenir?
- İkili operatör nasıl aşırı yüklenir - karmaşık sayıları çıkarmak için?