Dalam tutorial ini, kita akan belajar mengenai pengendalian yang berlebihan dengan bantuan contoh.
Dalam C ++, kita dapat mengubah cara pengendali bekerja untuk jenis yang ditentukan pengguna seperti objek dan struktur. Ini dikenali sebagai operator berlebihan . Sebagai contoh,
Katakan kita telah membuat tiga objek c1, c2 dan hasil dari kelas bernama Complex
yang mewakili nombor kompleks.
Oleh kerana terlalu banyak operator membolehkan kita mengubah cara pengendali bekerja, kita dapat mentakrifkan semula cara +
pengendali berfungsi dan menggunakannya untuk menambahkan nombor kompleks c1 dan c2 dengan menulis kod berikut:
result = c1 + c2;
bukannya seperti
result = c1.addNumbers(c2);
Ini menjadikan kod kami intuitif dan mudah difahami.
Nota: Kami tidak boleh menggunakan pengendali muatan untuk jenis data asas seperti int
, float
, char
dan sebagainya.
Sintaks untuk Pembebanan Operator C ++
Untuk membebani operator, kami menggunakan operator
fungsi khas .
class className (… public returnType operator symbol (arguments) (… )… );
Di sini,
returnType
ialah jenis fungsi yang dikembalikan.- operator adalah kata kunci.
symbol
adalah pengendali yang kita mahu bebankan. Suka:+
,<
,-
,++
, dan lain-lainarguments
adalah argumen yang dihantar ke fungsi.
Pengendalian Berlebihan Pengendali di Unary Operator
Pengendali yang tidak bergerak beroperasi hanya pada satu operasi. Pengendali kenaikan ++
dan pengendalian penurunan --
adalah contoh pengendali yang tidak berubah.
Contoh1: Operator ++ (Unary Operator) Overloading
// 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; )
Pengeluaran
Kira: 6
Di sini, apabila kita menggunakan ++count1;
, void operator ++ ()
disebut. Ini meningkatkan atribut nilai untuk bilangan objek1 dengan 1.
Catatan: Apabila kami membebani operator, kami dapat menggunakannya untuk bekerja dengan cara yang kami suka. Sebagai contoh, kita boleh digunakan ++
untuk menambah nilai sebanyak 100.
Walau bagaimanapun, ini menjadikan kod kita membingungkan dan sukar difahami. Tugas kami sebagai pengaturcara untuk menggunakan pengendali berlebihan dengan betul dan secara konsisten dan intuitif.
Contoh di atas hanya berfungsi apabila ++
digunakan sebagai awalan. Untuk menjadikan ++
kerja sebagai perbaikan pos, kami menggunakan sintaks ini.
void operator ++ (int) ( // code )
Perhatikan bahagian int
dalam tanda kurung. Ia adalah sintaks yang digunakan untuk menggunakan pengendali yang tidak berfungsi sebagai perbaikan pasca; itu bukan parameter fungsi.
Contoh 2: Operator ++ (Unary Operator) Beban berlebihan
// 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; )
Pengeluaran
Kira: 6 Kira: 7
The Contoh 2 berfungsi apabila ++
digunakan sebagai kedua-dua awalan dan postfix. Namun, ia tidak akan berfungsi sekiranya kita berusaha melakukan perkara seperti ini:
Count count1, result; // Error result = ++count1;
Ini kerana jenis pengembalian fungsi pengendali kami adalah void
. Kami dapat menyelesaikan masalah ini dengan menjadikannya Count
sebagai fungsi pengembalian fungsi pengendali.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Contoh 3: Nilai Pulangan dari Fungsi Operator (++ Operator)
#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; )
Pengeluaran
Kira: 6 Kira: 7
Di sini, kami telah menggunakan kod berikut untuk overload operator awalan:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
Kod untuk overloading pengendali postfix juga sama. Perhatikan bahawa kami telah membuat temp objek dan mengembalikan nilainya ke fungsi operator.
Perhatikan juga kodnya
temp.value = ++value;
Nilai pemboleh ubah tergolong dalam objek count1 main()
karena count1 memanggil fungsi, sementara temp.value milik objek temp.
Kelebihan Beban Pengendali dalam Pengendali Perduaan
Pengendali binari bekerja pada dua operan. Sebagai contoh,
result = num + 9;
Di sini, +
adalah operator binari yang berfungsi pada bilangan operasi dan 9
.
Apabila kita membebankan operator binari untuk jenis yang ditentukan pengguna dengan menggunakan kod:
obj3 = obj1 + obj2;
Fungsi operator dipanggil menggunakan objek obj1 dan obj2 diteruskan sebagai argumen untuk fungsi.
Contoh 4: Beban Pengendali Binari C ++
// 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; )
Pengeluaran
Masukkan nombor kompleks pertama: Masukkan bahagian nyata dan khayalan masing-masing: 9 5 Masukkan nombor kompleks kedua: Masing-masing masukkan bahagian nyata dan khayalan: 7 6 Nombor Kompleks Keluaran: 16 + 11i
Dalam program ini, fungsi pengendali adalah:
Complex operator + (const Complex& obj) ( // code )
Daripada ini, kita juga boleh menulis fungsi ini seperti:
Complex operator + (Complex obj) ( // code )
Walau bagaimanapun,
- menggunakan
&
menjadikan kod kami cekap dengan merujuk objek complex2 dan bukannya membuat objek pendua di dalam fungsi operator. - penggunaan
const
dianggap sebagai amalan yang baik kerana menghalang fungsi pengendali daripada mengubah kompleks2

Perkara yang Perlu Diingat dalam C ++ Pengendalian yang berlebihan
- Dua pengendali
=
dan&
sudah berlebihan secara lalai dalam C ++. Sebagai contoh, untuk menyalin objek dari kelas yang sama, kita boleh menggunakan=
operator secara langsung . Kami tidak perlu membuat fungsi pengendali. - Lebihan operator tidak dapat mengubah keutamaan dan kaitan operator. Namun, jika kita ingin mengubah urutan penilaian, tanda kurung harus digunakan.
- Terdapat 4 pengendali yang tidak boleh dibebankan secara berlebihan dalam C ++. Mereka adalah:
::
(penyelesaian skop).
(pemilihan ahli).*
(pemilihan ahli melalui penunjuk untuk berfungsi)?:
(pengendali ternary)
Lawati halaman ini untuk mengetahui lebih lanjut mengenai:
- Bagaimana membebani operator kenaikan dengan cara yang betul?
- Bagaimana membebani operator binari - untuk mengurangkan nombor kompleks?