오늘도 C++ 수업.
복사 생성자
얕은 복사와 깊은 복사
예를 들어, 얕은 복사는 어린이만 복사하고 어린이가 가진 장난감은 복사하지 않는다. 아이는 둘, 장난감은 하나, 장난감 하나를 둘이서 공유하기 때문에 충돌이 일어난다.
깊은 복사는 어린이가 가지고 있는 장난감까지 복사하므로 충돌이 발생하지 않는다.
얕은 복사~ 포인터가 객체의 멤버로 들어가 있을 때 복사본과 원본이 메모리를 공유하는 상황이 생김. 이로 인해 문제가 생길 수 있음.
깊은 복사~ 동적 메모리 할당까지 다 복사되므로 원본과 독립된 멤버를 복사본이 가지게 됨. 이로 인해 메로리를 공유하지 않음.
class Person {
int id;
char *name;
};
char st[] = new st;
st[] = "kitae";
name = &st[];
// Person 클래스는 id와 name 멤버를 가지고 있으며, 원본 Person 객체의 id는 1이고 name 포인터는 "kitae" 문자열을 가진 동적 할당 배열을 가리키고 있다. 이 상태에서 얕은 복사가 이루어지면 원본 객체의 id와 name 멤버는 현재 상태 그대로 사본 객체에 복사되므로, 사본의 name은 원본의 name 메모리를 공유하게 된다. 그러나 깊은 복사는 원본의 name 포인터가 가리키는 메모리까지 복사하여 원본과 사본의 name은 별개의 메모리를 가리키므로, 완전한 복사가 이루어진다.