[OOP] Nạp chồng toán tử tăng (++), giảm (–)

Toán tử tăng (++), giảm (- -) là toán tử 1 ngôi, làm thay đổi giá trị của toán hạng, nên khi nạp chồng toán tử tăng, giảm ta sử dụng member function.

Xem lại các bài viết liên quan về toán tử

Giới thiệu về nạp chồng toán tử.

Các dạng của nạp chồng toán tử.

Lựa chọn phương thức nạp chồng toán tử.

Các toán tử tăng giảm có 1 chút khác biệt đó là có 2 trạng thái tiền tố và hậu tố.

Tiền tố : Tăng giá trị lên 1 rồi thực hiện biểu thức.

int x = 1;
int y = ++x + 1;
=> Tăng x = 2 rồi gán y = 2 + 1 = 3
Kết quả : x = 2; y = 3

Hậu tố : Thực hiện biểu thức rồi tăng giá trị lên 1

int x = 1;
int y = x++ + 1;
=> Thực hiện y = 1 + 1 = 2 rồi tăng x = 2
Kết quả : x = 2; y = 2

Khi nạp chồng toán tử tăng, giảm cho tiền tố và hậu tố cũng khác nhau, ta cùng xem xét dưới đây.

Nạp chồng toán tử tăng, giảm cho tiề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);

   }

   //Nap chon toan tu tang tien to
   PS& operator++()

   {

      this->tu = this->tu + this->mau;

      return *this;

   }
};

int main()

{

   PS ps(2, 3);

   ++ps;

   cout << ps.ToString();

   return 0;

}

Kết quả:

5/3

Trong ví dụ trên ta nạp chồng toán tử tăng cho tiền tố của 1 phân số. Đơn giản ta thay đổi giá trị của con trỏ this rồi trả về con trỏ this.

Nạp chồng toán tử tăng, giảm cho hậu tố.

Như chúng ta đã biết nạp chồng hàm là các hàm có cùng tên nhưng có parameter khác nhau. Với các hàm toán tử tăng, giảm thì sẽ có cùng tên (operator++ hoặc operator–) và cùng tham số. Khi đó ta sẽ đặt ra câu hỏi.

Trình biên dịch sẽ phân biệt thế nào giữa nạp chồng toán tử cho tiền tố và hậu tố?

Để giải quyết vấn đề này trong C++ sẽ sử dụng tham số giả cho hậu tố. Tức là khi nạp chồng toán tử tăng giảm cho hậu tố ta sẽ thêm tham số kiểu int cho hàm.

Khi đó :

Tiền tố : PS& operator++()
Hậu tố : PS operator++(int)

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

   }

   //Nạp chồng toán tử tăng cho hậu tố
   PS operator++(int)

   {

      PS temp(tu, mau);

      this->tu = this->tu + this->mau;

      return temp;

   }

   //nạp chồng toán tử cộng 2 phân số
   friend PS& operator+(PS& ps1, PS& ps2);

};

PS& operator+(PS& ps1, PS& ps2)

{

   PS res(0,0);

   res.tu = ps1.tu * ps2.mau + ps1.mau * ps2.tu;

   res.mau = ps1.mau * ps2.mau;

   return res;

}

int main()

{

   PS ps1(2, 3);

   PS ps2(3, 4);

   PS ps = ps1++ + ps2;

   cout << "ps1 = " << ps1.ToString() << endl;

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

   return 0;

}

Kết quả:

ps1 = 5/3
ps = 17/12

Trong ví dụ trên ta nạp chồng toán tử tăng cho hậu tố của 1 phân số.


PS operator++(int)

{

   PS temp(tu, mau);

   this->tu = this->tu + this->mau;

   return temp;

}

Trong hàm nạp chồng toán tử cho hậu tố ta sử dụng biến tạm để lưu giá trị ( trước khi tăng) cho thực hiện phép tính.

Phép cộng 2 phân số trong hàm main:

PS ps = ps1++ + ps2;

Có thể hiểu như sau

ps = temp + ps2; // Biến temp trong hàm toán tử.
ps1 = ps1 + 1; //con trỏ this trong hàm toán tử.

Was this article helpful?

Leave A Comment?