C++ 언어에서는 아래와 같은 형식으로 객체 간 복사가 가능하다.
class SoSimple
{
private :
int num1;
int num2;
public :
SoSimple(int n1, int n2) : num1(n1), num2(n2) { }
void ShowSimpleData()
{
cout<<num1<<endl;
cout<<num2<<endl;
}
};
int main(void)
{
SoSimple sim1(15, 20);
SoSimple sim2 = sim1; //sim2 객체가 sim1 객체의 구성 요소(멤버 변수)를 복사
sim2.ShowSimpleData();
return (0);
}
위 예제에서, 객체의 복사는 다음 구문에서 일어난다.
SoSimple sim2 = sim1;
이러한 형태의 구문은 묵시적 변환이 일어나 실제로는 다음의 형태로 해석된다. 1
SoSimple sim2(sim1);
이렇듯 객체 간 복사의 용도로 사용되는 생성자를 복사 생성자라고 한다. 그러나 위 예제에서는 복사 생성자가 생성되어 있지 않다. 그럼에도 복사가 정상적으로 이루어지는 이유는 디폴트 복사 생성자가 자동으로 삽입되기 때문이다.
디폴트 복사 생성자는 아래와 같은 형태를 띈다.
SoSimple(const SoSimple ©) : num1(copy.num1), num2(copy.num2) {}
대부분은 디폴트 복사 생성자만으로 객체 간 복사를 정상적으로 수행할 수 있지만, 개발자가 직접 복사 생성자의 동작을 정의해야하는 경우가 있다.
복사 생성자가 호출되는 시점은 크게 세가지로 구분할 수 있다.
- case 1 : 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우(앞서 보인 경우)
- case 2 : Call-by-value 방식의 함수 호출 과정에서 객체를 인자로 전달하는 경우
- case 3 : 객체를 반환하되, 참조형으로 반환하지 않는 경우
참고자료
Footnotes
-
explicit 키워드를 사용하여 이러한 묵시적 변환이 일어나지 않게 할 수 있다. ↩