반응형
- 여기서는 깊은 복사에 대한 개념을 위주로 보기 보단 코드로 작성 예시를 보겠다
- 얕은 복사와 깊은 복사로 나뉘게 되는데 보통 우리는 얕은 복사를 사용하게 된다. 하지만 동적 할당을 한 후 얕은 복사를 하게 되면 우변에 동적 할당 된 친구를 그냥 가리키는 것 밖에 안 된다. 그래서 새롭게 동적 할당을 하여 복사를 해주는 것이 깊은 복사라고 생각하면 된다.
Cat::Cat(Cat const &cat)
{
this->brain = nullptr;
*this = cat;
std::cout << "Cat Constructor copy called\\n";
}
Cat& Cat::operator=(Cat const &cat)
{
if (this == &cat)
return *this;
this->type = cat.getType();
if (this->brain)
{
delete this->brain;
}
this->brain = new Brain(*(cat.brain));
std::cout << "Cat operator = " << type << " called\\n";
return (*this);
}
- 위 코드 처럼 복사 생성자가 있고 복사 할당 연산자가 있다.
- 복사 생성자가 사용 될 때
Dog basic
{
//1번 경우
Dog tmp = basic;
//2번 경우
Dog a;
Dog b(a);
}
- 위 코드 처럼 1번 경우는 변수 선언이 되고 바로 할당을 할때 복사 생성자가 불러와지며 2번 경우는 생성한 클래스를 넣어줄 때 불러와진다.
- 복사 생성자가 불러와지면 이제 복사 할당 연산자를 부르게 된다.
- 복사 할당 연산자 코드가 이 부분이다.
Cat& Cat::operator=(Cat const &cat)
{
if (this == &cat)
return *this;
this->type = cat.getType();
if (this->brain)
{
delete this->brain;
}
this->brain = new Brain(*(cat.brain));
std::cout << "Cat operator = " << type << " called\\n";
return (*this);
}
→ 현재 Cat클래스 안에는 Brain *brain 포인터로 이루어진 것이 있다. 이 친구는 동적 할당을 받은 상태이다.
- 깊은 복사를 할 때 좌변에 있는 친구가 brain을 가지고 있으면 없애주고 새로운 친구를 할당받아 넣어주어야 깊은 복사가 이루어진다. 값을 하나씩 넣어주는 부분은 Brain 클래스 안에 설정 되어 있다.
반응형
'C++ > C++ 복사 생성자, 복사 할당 연산자(Canonical form)' 카테고리의 다른 글
복사 생성자와 복사 할당 연산자(Canonical form) (0) | 2023.12.01 |
---|---|
복사 할당 연산자 (0) | 2023.12.01 |
복사 생성자 (0) | 2023.12.01 |