Trong hướng dẫn này, chúng ta sẽ tìm hiểu về nạp chồng toán tử với sự trợ giúp của các ví dụ.
Trong C ++, chúng ta có thể thay đổi cách thức hoạt động của các toán tử đối với các kiểu do người dùng định nghĩa như đối tượng và cấu trúc. Điều này được gọi là quá tải toán tử . Ví dụ,
Giả sử chúng ta đã tạo ba đối tượng c1, c2 và kết quả từ một lớp có tên Complex
đại diện cho các số phức.
Vì nạp chồng toán tử cho phép chúng ta thay đổi cách hoạt động của toán tử, chúng ta có thể xác định lại cách +
hoạt động của toán tử và sử dụng nó để thêm các số phức c1 và c2 bằng cách viết đoạn mã sau:
result = c1 + c2;
thay vì một cái gì đó như
result = c1.addNumbers(c2);
Điều này làm cho mã của chúng tôi trực quan và dễ hiểu.
Lưu ý: Chúng tôi không thể sử dụng toán tử quá tải cho các kiểu dữ liệu cơ bản như int
, float
, char
và vân vân.
Cú pháp nạp chồng toán tử C ++
Để nạp chồng một toán tử, chúng ta sử dụng một operator
hàm đặc biệt .
class className (… public returnType operator symbol (arguments) (… )… );
Đây,
returnType
là kiểu trả về của hàm.- toán tử là một từ khóa.
symbol
là toán tử mà chúng tôi muốn nạp chồng. Giống như:+
,<
,-
,++
,, vvarguments
là các đối số được truyền cho hàm.
Quá tải toán tử trong toán tử đơn vị
Toán tử đơn nguyên chỉ hoạt động trên một toán hạng. Toán tử tăng ++
và toán tử giảm --
là các ví dụ về toán tử một ngôi.
Ví dụ1: Toán tử ++ (Toán tử đơn nhất) Nạp chồng
// 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; )
Đầu ra
Đếm: 6
Ở đây, khi chúng ta sử dụng ++count1;
, cái void operator ++ ()
được gọi là. Điều này làm tăng thuộc tính giá trị của đối tượng count1 lên 1.
Lưu ý: Khi chúng ta nạp chồng các toán tử, chúng ta có thể sử dụng nó để làm việc theo bất kỳ cách nào chúng ta muốn. Ví dụ, chúng tôi có thể đã sử dụng ++
để tăng giá trị lên 100.
Tuy nhiên, điều này làm cho mã của chúng tôi khó hiểu và khó hiểu. Công việc của chúng tôi với tư cách là một lập trình viên là sử dụng nạp chồng toán tử một cách hợp lý và theo cách nhất quán và trực quan.
Ví dụ trên chỉ hoạt động khi ++
được sử dụng làm tiền tố. Để thực hiện ++
công việc như một hậu tố, chúng tôi sử dụng cú pháp này.
void operator ++ (int) ( // code )
Chú ý int
bên trong dấu ngoặc đơn. Đó là cú pháp được sử dụng để sử dụng các toán tử một ngôi làm hậu tố; nó không phải là một tham số hàm.
Ví dụ 2: Toán tử ++ (Toán tử đơn vị) Nạp chồng
// 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; )
Đầu ra
Đếm: 6 Đếm: 7
Các Ví dụ 2 hoạt động khi ++
được sử dụng như cả tiền tố và hậu tố. Tuy nhiên, nó không hoạt động nếu chúng tôi cố gắng làm điều gì đó như sau:
Count count1, result; // Error result = ++count1;
Điều này là do kiểu trả về của hàm toán tử của chúng ta là void
. Chúng ta có thể giải quyết vấn đề này bằng cách đặt làm Count
kiểu trả về của hàm toán tử.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Ví dụ 3: Giá trị trả về từ Hàm toán tử (Toán tử ++)
#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; )
Đầu ra
Đếm: 6 Đếm: 7
Ở đây, chúng tôi đã sử dụng mã sau để nạp chồng toán tử tiền tố:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
Mã cho việc nạp chồng toán tử postfix cũng giống như vậy. Lưu ý rằng chúng ta đã tạo một đối tượng tạm thời và trả lại giá trị của nó cho hàm toán tử.
Cũng lưu ý mã
temp.value = ++value;
Giá trị biến thuộc đối tượng count1 main()
vì count1 đang gọi hàm, trong khi temp.value thuộc đối tượng tạm thời.
Quá tải toán tử trong toán tử nhị phân
Toán tử nhị phân hoạt động trên hai toán hạng. Ví dụ,
result = num + 9;
Đây, +
là một toán tử nhị phân hoạt động trên các toán hạng num và 9
.
Khi chúng tôi nạp chồng toán tử nhị phân cho các loại do người dùng xác định bằng cách sử dụng mã:
obj3 = obj1 + obj2;
Hàm toán tử được gọi bằng cách sử dụng đối tượng obj1 và obj2 được truyền như một đối số cho hàm.
Ví dụ 4: Nạp chồng toán tử nhị phân trong 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; )
Đầu ra
Nhập số phức thứ nhất: Nhập phần thực và phần ảo lần lượt: 9 5 Nhập số phức thứ hai: Nhập phần thực và phần ảo lần lượt: 7 6 Đầu ra Số phức: 16 + 11i
Trong chương trình này, hàm toán tử là:
Complex operator + (const Complex& obj) ( // code )
Thay vì điều này, chúng tôi cũng có thể viết hàm này như:
Complex operator + (Complex obj) ( // code )
Tuy nhiên,
- sử dụng
&
làm cho mã của chúng tôi hiệu quả bằng cách tham chiếu đến đối tượng complex2 thay vì tạo một đối tượng trùng lặp bên trong hàm toán tử. - sử dụng
const
được coi là một thực hành tốt vì nó ngăn không cho hàm toán tử sửa đổi complex2.

Những điều cần nhớ khi Nạp chồng toán tử C ++
- Hai toán tử
=
và&
đã được nạp chồng theo mặc định trong C ++. Ví dụ, để sao chép các đối tượng của cùng một lớp, chúng ta có thể sử dụng trực tiếp=
toán tử. Chúng ta không cần tạo một hàm toán tử. - Việc nạp chồng toán tử không thể thay đổi mức độ ưu tiên và tính liên kết của các toán tử. Tuy nhiên, nếu chúng ta muốn thay đổi thứ tự đánh giá thì nên sử dụng dấu ngoặc đơn.
- Có 4 toán tử không thể được nạp chồng trong C ++. Họ đang:
::
(giải quyết phạm vi).
(lựa chọn thành viên).*
(lựa chọn thành viên thông qua con trỏ đến chức năng)?:
(toán tử bậc ba)
Truy cập các trang này để tìm hiểu thêm về:
- Làm thế nào để nạp chồng toán tử tăng theo đúng cách?
- Làm thế nào để nạp chồng toán tử nhị phân - để trừ các số phức?