[OOP] Nạp chồng toán tử 1 ngôi +, -, !

Các toán tử 1 ngôi là các toán tử chỉ có 1 toán hạng. Toán tử sẽ áp dụng lên chính đối tượng mà ta nạp chồng vì vậy khi nạp chồng toán tử 1 ngôi ta sử dụng member function.

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

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

Nap chồng toán tử ‘-‘

Ví dụ:


#include <iostream>

#include <string>

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);

   }

   //nap chong toan tu -
   PS& operator-()

   {

      return PS(-tu, mau);

   }

};

int main()

{

   PS ps(3, 4);

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

   cout << (-ps).ToString() << endl;

   return 0;

}

Kết quả:

3/4
-3/4

Trong ví dụ trên ta nạp chồng toán tử ‘-‘ để trả về negative của 1 phân số.

Tại sao ko trả về *this mà phải tạo đối tượng mới?

PS& operator-()
{
    this->tu = -tu;
    return *this;
}

Vì toán tử ‘-‘ chỉ trả về negative của đối tượng mà không thay đổi giá trị của đối tượng gốc. Nếu ta thao tác trên con trỏ this và trả về this thì đối tượng gốc sẽ bị thay đổi vì vậy ta tạo và trả về đối tượng mới.

Nạp chồng toán tử !

Toán tử ! trả về giá trị đảo của biểu thức logic. Nểu biểu thức có giá trị true thì toán tử ! trả về false và ngược lại biểu thức có giá trị false thì toán tử ! trả về true.

Trong C++, 1 số có giá trị bằng 0 là false, mọi giá trị khác 0 là true. Mở rộng hơn khi xét về 1 đối tượng ta có thể coi khi các data member có giá trị mặc định thì đối tượng là “false” lúc đó toán tử ! trả về true.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Complex

{

private:

   int Vir;

   int Real;

public:

   Complex()

   {

      Vir = 0;

      Real = 0;

   }

   Complex(int vir, int real)

   {

      this->Vir = vir;

      this->Real = real;

   }

   //Trả về true nếu data member có giá trị mặc định
   bool operator!()

   {

      return (Vir == 0) && (Real == 0);

   }

};

int main()

{

   Complex cp;

   if (!cp)

   {

      cout << "Data member co gia tri mac dinh!" << endl;

   }

   else

   {

      cout << "Data member da duoc set gia tri" << endl;

   }

   return 0;

}

Kết quả:

Data member co gia tri mac dinh!

Was this article helpful?

Leave A Comment?