프로젝트를 진행중에 prototype을 clone하는 코드를 작성해야 했는데 다음과 같은 방식으로 작성한 코드를 보았고 이게 과연 복사 생성자를 호출할지, 그냥 생성자를 호출할 지 궁금했다.
CClass* CClass::Clone()
{
return new CClass(*this);
}
내가 아는 복사 생성자의 호출 시기는
- 객체를 인자로 넘길 때 reference 형태가 아닌 value 형태로 넘길 때
- 객체를 값으로 반환할 때
- 객체를 생성과 동시에 기존에 존재하는 객체로 초기화 할 때
이렇게 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번 경우에 해당되는 것 같다.
'공부 > C || C++' 카테고리의 다른 글
C++ 오버라이딩시 반환 타입을 자식 클래스 타입으로 하면 반환 타입이 다르게 오버라이딩 된다 (0) | 2021.08.21 |
---|---|
C++ 자식 클래스 복사 생성자 초기화 리스트에서 부모의 복사 생성자 호출하는 방법 (0) | 2021.08.17 |
C/C++ 파일 입출력 (0) | 2021.08.14 |
C/C++ 함수 포인터를 반환하는 함수 (0) | 2021.08.06 |
C 입력 버퍼 비우기 (0) | 2021.07.30 |