Person(const char *aName, int aAge) {
Name=new char[strlen(aName)+1];
strcpy(Name,aName);
Age=aAge;
}
~Person() {
delete [] Name;
}
void main()
{
Person Boy("강감찬",22);
Person Young=Boy;
Young.OutPerson();
}

Person Young = Boy; 에서 Young은 Boy가 가리키는 Name과 메모리를 공유하게 된다.
그런데 이 코드에서 파괴자에서 오류가 발생하는데, 두 Person 객체가 메모리를 공유하기 때문에
파괴자에서 할당한 메모리를 해제할 때 같은 메모리를 두 번 해제하기 때문에 에러가 발생하는 것이다.
정수형인 Age끼리 값이 복사되는 것은 아무 문제가 없지만 포인터끼리의 복사는 문제가 된다.
이것을 얕은 복사라고 하며 , 포인터를 그대로 복사하는 것이다.
그래서 값은 같지만 Young은 Boy의 Name을 빌려서 표현하는 독립적이지 못한 객체이다.
Person(const Person &Other) {
Name=new char[strlen(Other.Name)+1];
strcpy(Name,Other.Name);
Age=Other.Age;
}
위는 Person의 복사 생성자이고 얕은 복사와 같이 Person Young = Boy; 로 복사한다. 컴파일러는 이 구문을
Person Young = Person(Boy)로 읽기 때문에 위 코드와 같은 형식이다.
복사 생성자는 Name에 복사할 Name의 길이만큼 버퍼를 할당하여 복사한다. 이것을 깊은 복사라고 하는데,
생성할 때 new로 할당해서 깊은 복사가 필요한 거지, 아니라면 깊은 복사가 필요가 없다.

복사 생성자를 정의 하지 않으면 디폴트 복사 생성자가 호출된다.
Position(const Position &Other) {
x=Other.x;
y=Other.y;
ch=Other.ch;
}
디폴트 복사 생성자는 원본과 같은 사본을 만들고 깊은 복사를 하지는 않는다.
생성할 때 new로 메모리를 할당하는 것이 아니라 값만 대입하는 것이라면 디폴트 복사 생성자로도 충분하다.
'C++' 카테고리의 다른 글
| [C++] 다중 상속과 virtual 클래스 (0) | 2022.01.05 |
|---|---|
| [C++] 상속받은 멤버 초기화 (0) | 2022.01.05 |
| [C++] 연산자 오버로딩 (0) | 2022.01.04 |
| [C++] 프렌드 friend (0) | 2022.01.04 |
| [C++] 디폴트 인수 (0) | 2022.01.04 |