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을 넘겨줄 때도 복사 생성자 호출
}
------------------------------------------------------------------
사용자가 작성하지 않은 경우 디폴트 복사 생성자가 자동으로 만들어지지만 얕은 복사를 수행한다. 이 경우 멤버 변수에 동적으로 메모리가 할당되는 포인터라도 있다면 문제가 발생한다.
따라서 사용자가 포인터의 내용까지도 따로 복사해 주는 깊은 복사를 수행하는 복사생성자를 항상 작성해 두는 것이 바람직하다.
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
C/C++의 식별자 (변수,함수,클래스 등의 이름) (0) | 2015.04.27 |
---|---|
무료로 사용할 수 있는 C언어 개발 프로그램 Pelles C (0) | 2015.04.25 |
C++의 객체간 대입 (0) | 2015.04.22 |
[C/C++] 정수형 자료형 (0) | 2015.04.22 |
기본 자료형과 변수 (0) | 2015.04.22 |