[OOP] Giới thiệu nạp chồng toán tử (operator overloading)

Ta đã biết nạp chồng hàm là định nghĩa các hàm có cùng tên nhưng khác tham số. Nó cho phép chúng ta tạo ra nhiều biến thể của 1 hàm để làm việc với các kiểu dữ liệu khác nhau, mà không phải đặt tên hàm khác.

Có thể xem lại về nạp chồng hàm tại : Nạp chồng hàm, con trỏ hàm và tham số mặc định

Cũng giống như hàm ta cũng có thể định nghĩa các dạng của toán tử trong C++ để làm việc với các kiểu dữ liệu khác nhau, kể các với các kiểu dữ liệu người dùng tự định nghĩa. Ta gọi đó là nạp chồng toán tử (operator overloading).

Toán tử cũng giống như hàm?

Xét ví dụ

int x = 2;
int y = 3;
std::cout << x + y;

Trong ví dụ trên ta sử dụng toán tử ‘+’ để cộng 2 số nguyên. Khi thực hiện biểu thức x + y ta có thể hiểu rằng trình biên dịch đang gọi hàm :

operator+(x, y);

Với operator+ là tên hàm.

Một số vấn đề về nạp chồng toán tử:

1. Hầu hết các toán tử đều có thể nạp chồng, trừ 1 số toán tử sau đây.

  • Toán tử conditional (?:)
max = x > y ? x : y;
  • Toán tử sizeof.
  • Toán tử scope (::)
  • Toán tử member selector (.)
  • Toán tử pointer-to-member (.*) (->*)

Ví dụ về toán tử  pointer-to-member:


#include <iostream>

using namespace std;

class  Test

{

public:

   int m_val;

   Test() : m_val(20) {}

};

int Test::*ptr = &Test::m_val;

int main()

{

   Test t;

   cout << "t.*ptr = " << t.*ptr << endl;

   t.*ptr = 50;

   cout << "m_val = " << t.m_val << endl;

   return 0;

}

Kết quả:

t.*ptr = 20
m_val = 50

2. Ta chỉ có thể nạp chồng các toán tử đã tồn tại, không thể tạo mới hay đặt lại tên cho toán tử.

3. Khi ta nạp chồng toán tử thì ít nhất 1 toán hạng phải là kiểu người dùng tự định nghĩa.

Ví dụ : Ta không thể nạp chồng toán tử '+' với 2 toán hạng là cùng kiểu int (vì int là kiểu dữ liệu nguyên thủy).

4. Ta không thể thay đổi số lượng toán hạng của toán tử.

Was this article helpful?

Leave A Comment?