날마다 새롭게 또 날마다 새롭게

복사 생성자 본문

프로그래밍/C / C++

복사 생성자

아무유 2012. 9. 18. 13:52

C++ 스타일의 초기화 방식은 다음과 같이 두 가지로 볼 수 있다.

int num=20; 혹은 int num(20);

위의 두 가지 초기화 방식은 결과적으로 동일하다. 

객체 초기화 방식도 두 가지로 볼 수 있는데, 먼저 익숙한 대입 연사를 사용한 초기화 방식은 다음과 같다.

SoSimple sim1(15,20);     SoSimple sim2=sim1;

sim2 객체를 새로 생성해서 객체 sim1과 sim2 간의 멤버 대 멤버 복사가 일어난다고 볼 수 있다. 이 명령을 또 다른 초기화 방식을 적용하여 입력하면 다음과 같다.

SoSimple sim2(sim1);

sim1은 객체 이므로 객체를 인자로 받을 수 있는 생성자 호출이 이루어지고 있는 것을 볼 수 있다. 그렇다면 객체를 인자로 받을 수 있는 생성자는 어떻게 정의되어 있을까?

SoSimple(SoSimple &copy)

{ ... }

위와 같은 형태의 생성자를 복사생성자라고 부르고 객체와 객체의 멤버 복사 시 사용되는 것을 확인할 수 있다. 

그렇다면 복사 생성자를 정의하지 않는 경우 객체를 복사할 수 없는 것인가?

복사 생성자를 정의하지 않으면 멤버 대 멤버의 복사를 진행하는 디폴트 복사 생성자를 자동으로 삽입하므로 굳이 복사 생성자를 직접 정의할 필요는 없다.

복사 생성자의 호출 시점

객체를 새로 생성함과 동시에 동일한 자료형의 객체로 초기화 하는 경우 호출한다.

1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우

2. Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우

3. 객체를 반환하되, 참조형으로 반환하지 않는 경우



Comments