복사생성자는 한 객체의 내용을 다른 이름으로 복사하여 생성한 생성자이다. 생성된 생성자는 같으나 그 내용이 다른 객체를 복사하여 생성된 것이다.
자신과 같은 타입의 객체를 인자로 받으며 복사생성자가 정의되지 않으면 디폴트 복사생성자가 만들어진다.
MString(const MString& m)
: c_str_(m.c_str_), size_(m.size_)
{
}
//메인에서 호출할 때
MString str2 = str;
별도의 공간을 마련하지 않고 포인터의 주소값만 복사하는 것이다.
int* ptr2 = ptr1;
원본데이터를 손실할 수 있으며 그 객체에 접근하는 포인터가 2개(ptr1
, ptr2
)인 셈이다.
만약 얕은 복사된 객체에 접근하는 포인터중 1개가 바뀌면 다른 하나도 의도치 않게 바뀐것으로 알게된다.
Munja(const Munja& hj): str_(hj.str_)
{
}
주소값만 가져온다.
얕은 복사와 달리 별도의 공간을 만들어 포인터가 가리키는 내용을 복사한다.
int* prt2 = new int[3];
for(int i = 0; i<3; i++){
ptr2[i] = ptr[i];
}
깊은 복사를 하면 원본 데이터가 유지된다.
Munja(const Munja& hj)
{
str_ = new char[strlen(hj.str_) + 1];
strcpy(str_, hj.str_);
}
값을 모두 가져온다.