[OOP] Toán tử gán và hàm tạo sao chép (copy constructor)

Toán tử gán và hàm copy constructor đều được đùng đề copy 1 đối tượng sang 1 đối tượng khác. Tuy nhiên giữa chúng có sự khác nhau.

  • Hàm copy constructor sẽ tạo đối tượng mới.
  • Toán tử gán thay thế nội dung của đối tượng đã tồn tại.

Ví dụ:


class PS

{

private:

   int tu;

   int mau;

public:

   PS(int tu, int mau)

   {

      this->tu = tu;

      this->mau = mau;

   }

};

PS ps1 (3,4);

PS ps2 (ps1);  // Hàm copy constructor được gọi

PS ps3 = ps1;  // Hàm copy constructor được gọi

PS ps4; 

ps4 = ps1; // Hàm toán tử gán được gọi

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

Không giống các toán tử khác ta không thể sử dụng nếu ta không nạp chồng trong class mà ta định nghĩa. Còn với toán tử gán thì ta vẫn có thể sử dụng vì trình biên dịch sẽ cung cấp 1 hàm toán tử gán default cho class mà ta định nghĩa. Tuy nhiên ta vẫn có thể nạp chồng toán tử gán, khi đó trình biên dịch sẽ sử dụng hàm toán tử gán mà ta đã nạp chồng.

Toán tử gán làm thay đổi giá trị toán hạng bên trái nên khi nạp chồng ta sử dụng member function.

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

Ví dụ


#include <iostream>

#include <string>

using namespace std;

class PS

{

private:

   int tu;

   int mau;

public:

   PS() : PS(0,0)

   {
      //TODO
   }

   PS(int tu, int mau)

   {

      this->tu = tu;

      this->mau = mau;

   }

   string ToString()

   {

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

   }

   //Nap chon toan tu gan
   PS& operator=(const PS& ps)

   {

      cout << "Ham toan tu gan duoc goi" << endl;

      this->tu = ps.tu;

      this->mau = ps.mau;

      return *this;

   }

};

int main()

{

   PS ps1(2, 3);

   PS ps2;

   ps2 = ps1;

   cout << ps2.ToString();

   return 0;

}

Kết quả:

Ham toan tu gan duoc goi
2/3

Hàm copy constructor

Hàm tạo sao chép (copy constructor) là 1 dạng đặc biệt của hàm khởi tạo (constructor) được sử dụng để tạo 1 đối tượng mới copy từ 1 đối tượng đã tồn tại.

Trong C++ sẽ cung cấp cho ta 1 hàm default copy constructor.

Ta có thể định nghĩa hàm copy constructor 1 cách tường minh.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class PS

{

private:

   int tu;

   int mau;

public:

   PS() : PS(0,0)

   {
      //TODO
   }

   PS(int tu, int mau)

   {

      this->tu = tu;

      this->mau = mau;

   }

   PS(const PS& ps)

   {

      cout << "Ham copy constructor duoc goi" << endl;

      this->tu = ps.tu;

      this->mau = ps.mau;

   }

   string ToString()

   {

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

   }

};

int main()

{

   PS ps1(2, 3);

   PS ps2 = ps1;

   cout << ps2.ToString();

   return 0;

}

Kết quả:

Ham copy constructor duoc goi
2/3

Was this article helpful?

Leave A Comment?