공부/C || C++

C++ return new(*this); 는 복사 생성자를 호출한다

sudo 2021. 8. 17. 19:27

프로젝트를 진행중에 prototype을 clone하는 코드를 작성해야 했는데 다음과 같은 방식으로 작성한 코드를 보았고 이게 과연 복사 생성자를 호출할지, 그냥 생성자를 호출할 지 궁금했다.

CClass* CClass::Clone()
{
    return new CClass(*this);
}

내가 아는 복사 생성자의 호출 시기는 

  1. 객체를 인자로 넘길 때 reference 형태가 아닌 value 형태로 넘길 때
  2. 객체를 값으로 반환할 때
  3. 객체를 생성과 동시에 기존에 존재하는 객체로 초기화 할 때

이렇게 3가지 인데, 저 3가지중에 어디에 해당되는지 확신이 없었다. 1, 2번은 당연히 아니고 3번이 의심돼서 아래와 같은 코드를 작성하고 직접 확인해보았다.

//CClass.h

class CClass
{
public:
	CClass();
	~CClass();
	CClass(const CClass& obj);
	CClass* Clone();

public:
	int m_Num;
};
//CClass.cpp

CClass::CClass()
{
    std::cout << "constructor" << std::endl;
}

CClass::~CClass()
{
    std::cout << "destructor" << std::endl;
}

CClass::CClass(const CClass& obj)
{
    m_Num = obj.m_Num;
    std::cout << "copy constructor" << std::endl;
}

CClass* CClass::Clone()
{
    return new CClass(*this);
}
int main()
{
	CClass obj1;
	obj1.m_Num = 10;

	CClass* obj2 = obj1.Clone();
	std::cout << obj2->m_Num << std::endl;

	delete obj2;

	return 0;
}

 

복사 생성자가 호출됨을 확인할 수 있다. 아무래도 3번 경우에 해당되는 것 같다.