[OOP] Nạp chồng toán tử so sánh

Các toán tử so sánh trả về giá trị true/false và không thay đổi toán hạng bên trái, nên khi nạp chồng ta sử dụng friend function.

Xem lại bài viết chọn lựa phương thức nạp chồng toán tử.

Ví dụ:

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

class PS

{

private:

   int tu;

   int mau;

public:

   PS(int tu, int mau)

   {

      this->tu = tu;

      this->mau = mau;

   }

   string ToString()

   {

      return to_string(tu) + "/" + to_string(mau);

   }

   friend bool operator==(PS& ps1, PS& ps2);

   friend bool operator<(PS& ps1, PS& ps2);

   friend bool operator>(PS& ps1, PS& ps2);

};

bool operator==(PS& ps1, PS& ps2)

{

   return (ps1.tu * ps2.mau == ps1.mau * ps2.tu);

}

bool operator<(PS& ps1, PS& ps2)

{

   return (ps1.tu * ps2.mau < ps1.mau * ps2.tu);

}

bool operator>(PS& ps1, PS& ps2)

{

   return (ps1.tu * ps2.mau > ps1.mau * ps2.tu);

}

int main()

{

   vector<PS> v;

   v.push_back(PS(2, 3));

   v.push_back(PS(2, 5));

   v.push_back(PS(7, 8));

   v.push_back(PS(6, 5));

   v.push_back(PS(5, 4));

   sort(v.begin(), v.end());

   for (auto ps : v)

   {

      cout << ps.ToString() << " ";

   }

   return 0;

}

Kết quả:

2/5 2/3 7/8 6/5 5/4

Trong ví dụ trên ta định nghĩa 1 lớp Phân số, và nạp chồng các toán tử ‘==’ (so sánh bằng), ‘<‘ (nhỏ hơn), ‘>’ (lớn hơn) để so sánh 2 phân số. Trong hàm sort của thư viện <algorithm> sẽ gọi hàm toán từ ‘<‘ mà ta đã nạp chồng, để so sánh và sắp xếp các phân số tăng dần.

Nếu ta không nạp chồng toán tử ‘<‘ thì chương trình sẽ báo lỗi vì không thể so sánh 2 phân số với nhau.

Was this article helpful?

Leave A Comment?