2012년 2월 15일 수요일

[C++][클래스] 복사 생성자

복사 생성자의 형태는 아래와 같다.


클래스명(const  클래스명&  name)
{
         /// 내용
}



- 인자가 레퍼런스인 이유는?
인자를 직접 복사받아서 사용한다면 복사생성자 내에서 다른 복사생성자를 호출하고 그 복사 생성자가 다시 다른 복사생성자를 호출하는 무한 루프 상황이 발생할 수 있으며, 그때 실제 메모리 복사가 일어나므로 메모리 오버플로우 등의 에러가 발생할 수 있기 때문이다.
레퍼런스의 경우 메모리에 실체가 복사되는 것이 아니므로 안전하다.



- 복사 생성자를 정의하는 이유?
클래스에 char* 처럼 메모리 동적할당을 받는 멤버변수가 있을 경우, 반드시 복사 생성자를 직접 정의하여 '깊은 복사'를 해줘야한다.

이때 복사생성자와 쌍으로 대입연산자(=)를 오버로딩하여 마찬가지로 깊은 복사를 하도록 정의해 주어야 한다.

참고로 깊은 복사란 메모리 공간을 별도로 할당 받고 그 내용을 복사받는 형태, 얕은 복사는 포인터가 가리키는 주소값 자체를 복사해 오는 것이다.
디폴트 복사 생성자는 얕은 복사를 하는데, 이 경우 같은 주소를 여러개의 다른 객체가 가리키는 것이므로 각각의 객체가 소멸될때마다 delete 명령어로 같은 메모리를 여러번 삭제하는 위험한 사태가 발생할 수 있게 된다.



- 복사 생성자가 호출되는 3가지 경우

1. 객체를 선언하고 초기화 할때

cTestClass tc1;
cTestClass tc2 = tc1;         // 여기서 호출된다.


2. 함수 인자로 객체가 복사되어 들어갈때(임시객체 생성)

void   TestFunc(TestClass tc);


3. 함수에서 객체를 값으로 복사해서 리턴할때(임시객체 생성)

TestClass  TestFunc();











댓글 없음:

댓글 쓰기