C++의 클래스에는 복사 생성자 (copy constructor)라는 것이 있는데 일반 생성자에 비해서 처음 C++을 익힐 때 그 동작에 대해서 간과하기 쉽다. 하지만 그 동작에 대해서 꼼꼼하게 살펴보지 않으면 논리적 오류가 만들어지기 쉽다.


  복사생성자가 호출되는 경우는 다음과 같은 경우가 있다.


-----------------------------------------------------------------

ClassOne c1, c2; // c1이 만들어지면서 일반 생성자를 호출

ClassOne c3 = c1;// ① 선언과 동시에 대입이 일어날때 복사 생성자를 호출

ClassOne c4(c1); // 위와 동일하게 복사생성자를 호출한다. 즉, ClassOne c4=c1 과 완전히 동일하다.

...

c2 = func(c1); //

...

ClassOne func(ClassOne co) { // ② 함수의 입력 인수 co 는 복사생성자로 생성됨

...

ClassOne cr;

....

return cr; // ③ cr을 넘겨줄 때도 복사 생성자 호출

}

------------------------------------------------------------------


사용자가 작성하지 않은 경우 디폴트 복사 생성자가 자동으로 만들어지지만 얕은 복사를 수행한다. 이 경우 멤버 변수에 동적으로 메모리가 할당되는 포인터라도 있다면 문제가 발생한다.


  따라서 사용자가 포인터의 내용까지도 따로 복사해 주는 깊은 복사를 수행하는 복사생성자를 항상 작성해 두는 것이 바람직하다.

[#00064]


Posted by 살레시오
,