2015년 4월 22일 수요일

[00064] C++의 복사 생성자 (copy constuctor)

  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]

댓글 없음:

댓글 쓰기