Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 복사 생성자는 언제 호출됩니까?

<시간/>

복사 생성자는 이전에 생성된 동일한 클래스의 객체로 초기화하여 객체를 생성하는 생성자입니다. 복사 생성자는 다음 작업에 사용됩니다. -

  • 같은 유형의 다른 개체에서 한 개체를 초기화합니다.
  • 객체를 복사하여 함수에 인수로 전달합니다.
  • 객체를 복사하여 함수에서 반환합니다.

복사 생성자가 클래스에 정의되어 있지 않으면 컴파일러 자체에서 복사 생성자를 정의합니다. 클래스에 포인터 변수가 있고 동적 메모리 할당이 있는 경우 복사 생성자가 있어야 합니다. 복사 생성자의 가장 일반적인 형태는 다음과 같습니다 -

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

여기, obj 다른 개체를 초기화하는 데 사용되는 개체에 대한 참조입니다.

예시 코드

#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;
}

출력

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

동일한 유형의 기존 개체를 사용하여 다른 개체를 생성하기 위해 약간의 변경을 가한 동일한 예를 살펴보겠습니다. −

예시 코드

#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;
}

출력

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!