C++/C++ 복사 생성자, 복사 할당 연산자(Canonical form)

깊은 복사

재윤 2024. 1. 24. 16:48
반응형
  • 여기서는 깊은 복사에 대한 개념을 위주로 보기 보단 코드로 작성 예시를 보겠다
  • 얕은 복사와 깊은 복사로 나뉘게 되는데 보통 우리는 얕은 복사를 사용하게 된다. 하지만 동적 할당을 한 후 얕은 복사를 하게 되면 우변에 동적 할당 된 친구를 그냥 가리키는 것 밖에 안 된다. 그래서 새롭게 동적 할당을 하여 복사를 해주는 것이 깊은 복사라고 생각하면 된다.
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 클래스 안에 설정 되어 있다.
반응형