잘못된 예시 (얕은 복사)
문제점 : a의 포인터 해제되지도 않았을 뿐더라 '5'의 값에 접근불가가 된다.
깊은 복사
#include <iostream>
using namespace std;
class String
{
public:
String()
{
cout << "String() 생성자 호출" << endl;
strData = NULL;
len = 0;
}
String(const char *str)
{
cout << "String(const char *) 생성자 호출" << endl;
len = strlen(str);
strData = new char[len + 1];
cout << "StrData 할당: " << (void *)strData << endl;
strcpy(strData, str);
}
~String()
{
cout << "~String() 소멸자 호출" << endl;
delete[] strData;
cout << "strData 해제됨: " << (void *)strData << endl;
strData = NULL;
}
char *GetstrData() const
{
return strData;
}
int Getlen() const
{
return len;
}
private:
char *strData;
int len;
};
int main()
{
String s1("안녕");
String s2(s1);
cout << s1.GetstrData() << endl;
cout << s2.GetstrData() << endl;
}
#include <iostream>
using namespace std;
class String
{
public:
String()
{
cout << "String() 생성자 호출" << endl;
strData = NULL;
len = 0;
}
String(const char *str)
{
cout << "String(const char *) 생성자 호출" << endl;
len = strlen(str);
strData = new char[len + 1];
cout << "StrData 할당: " << (void *)strData << endl;
strcpy(strData, str);
}
//매게변수로 String 클래스 타입을 받는것.
String(const String &ref)
{
cout << "String(String &ref) 생성자 호출" << endl;
strData = new char[ref.len + 1];
cout << "strData 할당: " << (void *)strData << endl;
strcpy(strData, ref.strData);
len = ref.len;
;
// len은 int타입이므로 애초에 서로 다른 메모리 공간상에 있는 객체. -> 깊은복사가 이루어짐.
len = ref.len;
}
~String()
{
cout << "~String() 소멸자 호출" << endl;
delete[] strData;
cout << "strData 해제됨: " << (void *)strData << endl;
strData = NULL;
}
char *GetstrData() const
{
return strData;
}
int Getlen() const
{
return len;
}
private:
char *strData;
int len;
};
int main()
{
String s1("안녕");
String s2(s1); //복사생성자
cout << s1.GetstrData() << endl;
cout << s2.GetstrData() << endl;
}
클래스 객체를 메개변수(ref)로 받는것.
따라서 해당 메개변수에 대한 주소값의 공간을 만들어 주는것.
깊은 복사를 위한것.