<클래스이름>(const 클래스이름&-rvalue도 복사하도록 const참조형을 사용)
class MyClass
{
int mValue;
public:
MyClass(int value):mValue {value}
{
std::cout << "[construct]:" << value << std::endl;
}
//copy constructor
//copy constructor (복사 생성자) : 복사를 담당하는 생성자가 객체에 따로 있음
//복사 초기화(합쳐서 쓰면 가능하게 해줌)
//원래 안되는데 합쳐서 하면 된다는 뜻
MyClass(const MyClass &from)
{
mValue = from.mValue;
std::cout << "[copy]:" << mValue << std::endl;
}
};
int main()
{
//MyClass c; 기본생성자는 인스턴스가 하나 생성되면 더 안해줌
//c = MyClass(5);
MyClass c1 = MyClass(5); //첫번째와 3번째는 같은 것
std::cout << "-----" << std::endl;
MyClass c2(c1);
//두번째 생성자는 복사(실제로 인스턴스를 다른 인스턴스로 만들어내는 복사)
//컴파일러도 민감하게 구분함
std::cout << "-----" << std::endl;
MyClass c3(MyClass(5)); //복사인 것 처럼 보이나 복사가 아님
std::cout << "-----" << std::endl;
}
class MyClass
{
int mValue;
public:
MyClass(int value):mValue {value}
{
std::cout << "[construct]:" << value << std::endl;
}
//copy constructor
//copy constructor (복사 생성자) : 복사를 담당하는 생성자가 객체에 따로 있음
//복사 초기화(합쳐서 쓰면 가능하게 해줌)
//원래 안되는데 합쳐서 하면 된다는 뜻
MyClass(const MyClass &from)
{
mValue = from.mValue;
std::cout << "[copy]:" << mValue << std::endl;
}
};
class Dog
{
};
class DogHouse
{
Dog *owner;
};
DogHouse h1;
DogHouse h2(h1);
//개 클래스가 개집 클래스를 2개를 쓰고 있어 문제가 생길 수 있음
//개집 클래스를 삭제할 때 개도 삭제될 수 있어 dangling pointer문제 생김
//이것이 얕은 복사(swallow copy)
//멤버 변수가 동적으로 관리하는 포인터라면 문제가 생김
//이 문제를 피하기 위해서 깊은 복사를 해야함
//개 집 클래스를 복사할 때 개까지 복사를 해야함 => 안전을 위해서
//이 것이 deep copy
//하지만 deep copy는 메모리가 더 들어감 => 그래서 기본이 아님
int main()
{
//MyClass c; 기본생성자는 인스턴스가 하나 생성되면 더 안해줌
//c = MyClass(5);
MyClass c1 = MyClass(5); //첫번째와 3번째는 같은 것
std::cout << "-----" << std::endl;
MyClass c2(c1);
//두번째 생성자는 복사(실제로 인스턴스를 다른 인스턴스로 만들어내는 복사)
//컴파일러도 민감하게 구분함
std::cout << "-----" << std::endl;
MyClass c3(MyClass(5)); //복사인 것 처럼 보이나 복사가 아님
std::cout << "-----" << std::endl;
}