복사 생성자


C++에서는 다음의 방식으로 선언 및 초기화가 가능하다.

int num(20);






Simple형 객체를 생성해라.

객체의 이름은 sim2로 정한다.

sim1을 인자로 받을 수 있는 생성자의 호출을 통해서 객체생성을 완료한다.


위의 객체생성문에서 호출하고자 하는 생성자는 다음과 같이 Simple 객체를 인자로 받을 수 있는 생성자이다.


Simple(Simple &copy)

{

}


그리고 다음의 문장도, 

Simple sim2 = sim1;


실은 다음의 형태로 묵시적 변환이 되어서(자동으로 변환이 되어서) 객체가 생성되는 것이다.

Simple sim2(sim1);



----------------------------------------------------------------------------------------------------------------------------------------




32행의 문장이 묵시적으로(자동으로) 변환된다는 사실만 제외하면 특별할 게 없는 예제이다. 14행에 정의된 생성자도 이해할만한 수준의 생성자이다. 그런데 이러한 생성자를 가리켜 별도로 "복사 생성자(Copy Constructor)" 라 부른다.

이는 생성자의 정의형태가 독특해서 붙은 이름이 아니다. 다만 이 생성자가 호출되는 시점이 다른 일반 생성자와 차이가 있기 때문에 붙은 것이다.

즉, 복사 생성자를 정확히 이해하기 위해서는 복사 생성자의 호출시점을 확실히 이해해야 한다.


----------------------------------------------------------------------------------------------------------------------------------------


자동으로 삽입이 되는 디폴트 복사 생성자


: 복사 생성자를 정의하지 않으면, 멤버 대 멤버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다.


생성자가 존재하더라도, 복사 생성자가 정의되어 있지 않으면 디폴트 복사 생성자라는 것이 삽이되어 멤버 대 멤버의 복사를 진행한다.


class Simple

{

int num1;

int num2;


public:

Simple(int n1, int n2) : num1(n1), num2(n2)

{ }

};


class Simple

{

int num1;

int num2;


public:

Simple(int n1, int n2) : num1(n1), num2(n2)

{ }

Simple(const Simple &copy)  : num1(copy.num1), num2(copy.num2)

{ }

};


위의 두 클래스 정의는 완전히 동일한 것이다. 디폴트 복사 생성자가 자동으로 삽입되기 때문이다.


※ 많은 경우에 있어서 복사 생성자를 직접 정의하지 않아도 된다. 그러나 반드시 복사 생성자를 정의해야 하는 경우도 있다.

'Programming > C++' 카테고리의 다른 글

깊은 복사 & 얕은 복사  (0) 2012.05.24
explicit  (0) 2012.05.23
this 포인터  (0) 2012.05.21
객체 배열 & 객체 포인터 배열  (0) 2012.05.21
생성자 & 소멸자를 이용한 예제  (0) 2012.05.21
Posted by scii
: