Operator Overloading là nạp chồng toán tử – Cho phép các lớp do người dùng định nghĩa (user-defined) có thể có các chức năng như các kiểu dữ liệu có sẵn do ngôn ngữ lập trình đã định nghĩa.
– Mục đích: để viết mã chương trình gọn gàng, dễ hiểu hơn thay vì phải gọi phương thức, chúng ta có thể gọi thông qua toán tử bằng các phép tính thông thường.
– Ví dụ: khi ta muốn tính tổng 2 phân số chỉ cần gọi: “ps1 + ps2“, hay muốn tính hiệu của 2 đoạn thẳng thì chỉ cần gọi “line1 – line2“,…
– Một số đặc điểm của nạp chồng toán tử:
- Các toán tử được nạp chồng là các hàm có tên đặc biệt: dùng từ khóa “operator” đi theo sau đó là toán tử nạp chồng muốn định nghĩa.
- operator+:nạp chồng toán tử dấu cộng ( + )
- operator<:nạp chồng toán tử dấu nhỏ hơn ( < )
- operator!=:nạp chồng toán tử so sánh khác ( != )
- Cũng giống như bất kỳ một method nào khác, một toán tử được nạp chồng cũng có: kiểu trả về và danh sách các tham số.
- Toán tử nạp chồng thì bắt buộc phải khai báo public static.
– Bảng liệt kê các toán tử có thể và không thể nạp chồng trong C#:
| Toán tử | Miêu tả |
| +, -, !, ~, ++, — | Những toán tử một ngôi này nhận một toán hạng và có thể được nạp chồng |
| +, -, *, /, % | Những toán tử nhị phân này nhận một toán hạng và có thể được nạp chồng |
| =, !=, <, >, <=, >= | Các toán tử so sánh có thể được nạp chồng |
| &&, || | Các toán tử logic điều kiện không thể được nạp chồng một cách trực tiếp |
| +=, -=, *=, /=, %= | Các toán tử gán không thể được nạp chồng |
| =, ., ?:, ->, new, is, sizeof, typeof | Các toán tử này không thể được nạp chồng |
– Để dễ hiểu, sau đây mình minh họa nạp chồng toán tử dấu cộng cho lớp phân số:
using System;
namespace MinhHoangBlog
{
class NapChongToanTu
{
static void Main(string[] args)
{
// Trường hợp cùng mẫu số
PhanSo ps1 = new PhanSo(4, 9);
PhanSo ps2 = new PhanSo(11, 9);
PhanSo ps3 = ps1 + ps2;
ps3.InPhanSo();
// Trường hợp khác mẫu số
PhanSo ps4 = new PhanSo(2, 3);
PhanSo ps5 = new PhanSo(7, 5);
PhanSo ps6 = ps4 + ps5;
ps6.InPhanSo();
Console.ReadKey();
}
}
class PhanSo
{
private int m_tuso;
private int m_mauso;
// Constructor
public PhanSo(int tuso, int mauso)
{
m_tuso = tuso;
m_mauso = mauso;
}
// Nạp chồng toán tử phép cộng +
public static PhanSo operator +(PhanSo ps1, PhanSo ps2)
{
int ts = 0;
int ms = 0;
// Trường hợp cùng mẫu số
if (ps1.m_mauso == ps2.m_mauso)
{
ts = ps1.m_tuso + ps2.m_tuso;
ms = ps1.m_mauso;
//Tối giản phân số
ToiGianPhanSo(ref ts, ref ms);
}
// Trường hợp khác mẫu số
else
{
ts = (ps1.m_tuso * ps2.m_mauso) + (ps2.m_tuso * ps1.m_mauso);
ms = ps1.m_mauso * ps2.m_mauso;
// Tối giản phân số
ToiGianPhanSo(ref ts, ref ms);
}
return new PhanSo(ts, ms);
}
// Tối giản phân số
private static void ToiGianPhanSo(ref int ts, ref int ms)
{
int i, j, uscln = 1;
j = (ts > ms) ? ts : ms;
for (i = 1; i <= j; i++)
{
if (ts % i == 0 && ms % i == 0)
{
uscln = i;
}
}
ts = ts / uscln;
ms = ms / uscln;
}
// In phân số
public void InPhanSo()
{
Console.WriteLine(m_tuso + "/" + m_mauso);
}
}
}

Kết quả chương trình
