묵시적 복사 생성
C++의 복사 생성자가 묵시적으로 호출되며 객체가 복사되는 경우를 묵시적 복사 생성이라고 한다. 묵시적인 복사 생성의 경우는 다음 3가지로서, 컴파일러가 복사 생성자를 자동으로 호출하는 경우이다.
1. 객체로 초기화하여 객체가 생성될 때
다음은 son 객체를 생성할 때 father 객체로 초기화하도록 하는 선언문이다. ==> Person son = father; //복사 생성자 자동 호출
컴파일러는 위의 문장을 다음과 같이 변환하여 복사 생성자를 호출한다. ==> Person son(father);
위의 과정을 다음의 치환문과 혼돈하지 마라.
i.e.
Person son;
son = father; //복사 생성자 호출되지 않음
위의 경우는 복사 생성자가 아니라 대입 연산자(혹은 대입 함수)가 호출되면서 대입 연산을 진행한다. 대입 함수 역시 복사 생성자처럼 정의를 할 수 있지만, 미리 구현해 놓지 않으면 컴파일러가 자동으로 기본 대입 함수를 삽입한다. 이때, 이 기본 대입 함수는 얕은 복사를 하기 때문에 되도록이면 깊은 복사를 하는 대입 연산자를 직접 구현하는 것이 좋다. 대입 연산자에 대해서는 후에 더 자세히 설명하도록 하겠다.
2. 값에 의한 호출로 객체가 전달될 때
값에 의한 호출로 객체가 전달되면, 함수의 매개 변수 객체가 생성될 때 복사 생성자가 자동으로 호출된다.
다음 예제를 통해서 자세히 알아보도록 하자.
i.e.
void f(Person person) { //매개 변수 person이 생성될 때 복사 생성자 호출
...
}
Person p;
f(p); //값에 의한 호출로 p 객체 전달 -> 복사 생성자가 호출됨
위에서 볼 수 있듯이, 값에 의한 호출로 매개 변수 객체가 생성될 때, 생성자 대신 복사 생성자가 실행된다.
3. 함수가 객체를 리턴할 때
함수가 객체를 리턴할 때, return 문은 리턴 객체의 복사본을 생성하여 호출한 곳으로 전달한다. 복사본이 생성될 때에 복사 생성자가 실행된다.