Computer >> Máy Tính >  >> Lập trình >> C ++

Khi nào hàm tạo bản sao được gọi trong C ++?

Phương thức khởi tạo sao chép là một phương thức khởi tạo tạo một đối tượng bằng cách khởi tạo nó bằng một đối tượng cùng lớp, đã được tạo trước đó. Hàm tạo bản sao được sử dụng để -

  • Khởi tạo một đối tượng từ một đối tượng khác cùng loại.
  • Sao chép một đối tượng để chuyển nó làm đối số cho một hàm.
  • Sao chép một đối tượng để trả lại nó từ một hàm.

Nếu một phương thức khởi tạo sao chép không được định nghĩa trong một lớp, thì chính trình biên dịch sẽ định nghĩa một phương thức khởi tạo. Nếu lớp có các biến con trỏ và có một số cấp phát bộ nhớ động, thì bắt buộc phải có một phương thức khởi tạo sao chép. Dạng phổ biến nhất của hàm tạo bản sao được hiển thị ở đây -

classname (const classname &obj) {
   // body of constructor
}

Đây, obj là một tham chiếu đến một đối tượng đang được sử dụng để khởi tạo một đối tượng khác.

Mã mẫu

#include <iostream>
using namespace std;

class Line {
   public:
      int getLength( void );
      Line( int len ); // simple constructor
      Line( const Line &obj); // copy constructor
      ~Line(); // destructor

   private:
      int *ptr;
};

// Member functions definitions including constructor
Line::Line(int len) {
   cout << "Normal constructor allocating ptr" << endl;

   // allocate memory for the pointer;
   ptr = new int;
   *ptr = len;
}

Line::Line(const Line &obj) {
   cout << "Copy constructor allocating ptr." << endl;
   ptr = new int;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void) {
   cout << "Freeing memory!" << endl;
   delete ptr;
}

int Line::getLength( void ) {
   return *ptr;
}

void display(Line obj) {
   cout << "Length of line : " << obj.getLength() <<endl;
}

// Main function for the program
int main() {
   Line line(10);
   display(line);
   return 0;
}

Đầu ra

Normal constructor allocating ptr
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!

Chúng ta hãy xem cùng một ví dụ nhưng với một thay đổi nhỏ để tạo một đối tượng khác bằng cách sử dụng một đối tượng hiện có cùng loại -

Mã mẫu

#include <iostream>
using namespace std;

class Line {
   public:
      int getLength( void );
      Line( int len ); // simple constructor
      Line( const Line &obj); // copy constructor
      ~Line(); // destructor

   private:
      int *ptr;
};

// Member functions definitions including constructor
Line::Line(int len) {
   cout << "Normal constructor allocating ptr" << endl;

   // allocate memory for the pointer;
   ptr = new int;
   *ptr = len;
}

Line::Line(const Line &obj) {
   cout << "Copy constructor allocating ptr." << endl;
   ptr = new int;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void) {
   cout << "Freeing memory!" << endl;
   delete ptr;
}

int Line::getLength( void ) {
   return *ptr;
}

void display(Line obj) {
   cout << "Length of line : " << obj.getLength() <<endl;
}

// Main function for the program
   int main() {
   Line line1(10);
   Line line2 = line1; // This also calls copy constructor

   display(line1);
   display(line2);
   return 0;
}

Đầu ra

Normal constructor allocating ptr
Copy constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
Freeing memory!