복사 생성자와 복사 대입 연산자는 정의하지 않아도 컴파일러가 암시적으로 만들어준다.
이 경우 얕은 복사가 일어난다.
얕은 복사 (Shallow Copy)
멤버 데이터를 비트열 단위로 똑같이 복사한다. (메모리 영역 값을 그대로 복사)
기본 복사 생성자나 기본 복사 대입 연산자는 값을 그대로 복사해준다.
깊은 복사 (Deep copy)
멤버 테이터가 참조(주소) 값이라면 데이터를 새로 만들어준다. (원본 객체가 참조하는 대상까지 새로 만들어서 복사)
복사 생성자를 암시적으로 사용하는 경우에는 부모 클래스와 멤버 클래스의 복사 생성자가 호출되지만, 명시적으로 사용하는 경우 부모 클래스와 멤버 클래스의 기본 생성자가 호출된다.
명시적으로 사용 시 부모와 멤버 클래스의 복사 생성자를 호출하기 원한다면 초기화 리스트에서 지정해 주어야 한다.
암시적 복사 생성자와 복사 대입 연산자
- 부모 클래스의 복사 생성자 호출
- 멤버 클래스의 복사 생성자 호출
- 멤버가 기본 타입일 경우 메모리 복사 (얕은 복사)
명시적 복사 생성자
- 부모 클래스의 기본 생성자 호출
- 멤버 클래스의 기본 생성자 호출
// 복사 생성자를 명시적으로 선언한 경우에는,
// 부모 클래스나 멤버 클래스의 복사 생성자를 초기화 리스트로 호출해주어야 한다.
Knight(const Knight& knight) : Player(knight), _pet(knight._pet)
{
cout << "Knight(const Knight&)" << endl;
_hp = knight._hp;
}
명시적 복사 대입 연산자 : 아무것도 해주지 않는다.
// 복사 대입 연산자를 명시적으로 선언한 경우에는,
// 부모 클래스와 멤버 클래스의 복사 대입 연산자를 호출해주어야 한다.
Knight& operator=(const Knight& knight)
{
cout << "opeator=(const Knight&)" << endl;
Player::operator=(knight);
_pet = knight._pet;
_hp = knight._hp;
return *this;
}
깊은 복사를 선택하게 되는 경우 필연적으로 명시적인 복사 생성자 또는 복사 대입 연산자가 필요하게 되는데, 그 순간 모든 책임은 프로그래머에게 위임된다.
'C++ > Rookiss C++' 카테고리의 다른 글
전방선언 (0) | 2022.08.29 |
---|---|
[동적 할당] 캐스팅 4총사 (0) | 2022.08.29 |
[동적 할당] 타입 변환 (0) | 2022.08.29 |
[동적 할당] 동적 할당 (0) | 2022.08.28 |
[객체지향 여행] (0) | 2022.08.28 |