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 &copy) : num1(copy.num1), num2(copy.num2) {}
 

대부분은 디폴트 복사 생성자만으로 객체 간 복사를 정상적으로 수행할 수 있지만, 개발자가 직접 복사 생성자의 동작을 정의해야하는 경우가 있다.


복사 생성자가 호출되는 시점은 크게 세가지로 구분할 수 있다.

  • case 1 : 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우(앞서 보인 경우)
  • case 2 : Call-by-value 방식의 함수 호출 과정에서 객체를 인자로 전달하는 경우
  • case 3 : 객체를 반환하되, 참조형으로 반환하지 않는 경우

참고자료

윤성우의_열혈_cpp_프로그래밍


Footnotes

  1. explicit 키워드를 사용하여 이러한 묵시적 변환이 일어나지 않게 할 수 있다.