복사 생성자(Copy Constructor)
Programming/C++ 2012. 5. 22. 20:58 |복사 생성자
C++에서는 다음의 방식으로 선언 및 초기화가 가능하다.
int num(20);
Simple형 객체를 생성해라.
객체의 이름은 sim2로 정한다.
sim1을 인자로 받을 수 있는 생성자의 호출을 통해서 객체생성을 완료한다.
위의 객체생성문에서 호출하고자 하는 생성자는 다음과 같이 Simple 객체를 인자로 받을 수 있는 생성자이다.
Simple(Simple ©)
{
}
그리고 다음의 문장도,
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 ©) : 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 |