여기에서 복사 생성자가 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!