C ++ Operatör Aşırı Yüklemesi (Örneklerle)

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 Complexkarmaşı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, charvb.

C ++ Operatör Aşırı Yüklemesi için Sözdizimi

Bir operatörü aşırı yüklemek için özel bir operatoriş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.
  • symbolaşırı yüklemek istediğimiz operatör. Gibi: +, <, -, ++, vb
  • arguments 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 )

intParantezlerin 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 consto complex2 değiştirmesini operatör fonksiyonunu önlediğinden iyi bir uygulama olarak kabul edilir.
C ++ 'da ikili operatörleri aşırı yükleme

C ++ Operatör Aşırı Yüklemesinde Hatırlanması Gereken Şeyler

  1. İ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.
  2. 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.
  3. C ++ 'da aşırı yüklenemeyen 4 operatör vardır. Onlar:
    1. :: (kapsam çözümü)
    2. . (üye seçimi)
    3. .* (işleve işaretçi aracılığıyla üye seçimi)
    4. ?: (üç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?

Ilginç makaleler...