深浅拷贝的认识与理解·
浅拷贝:按照被拷贝的对象的存储地址进行拷贝(不开辟新空间),一般为编译器默认的拷贝构造函数
深拷贝:创建一个新的空间,将需要拷贝的数据依次进行拷贝
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date s1(2014,5,6);
Date s2(s1);
s1.print();
s2.print();
return 0;
}
可以看出,在简单的拷贝中,不涉及销毁原对象,系统默认的浅拷贝是可以的。
class _string
{
public:
_string(const char* str = " ")
{
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
~_string()
{
delete[]_str;
_str = nullptr;
}
private:
char* _str;
};
void test()
{
_string s1("hello world");
_string s2(s1);
}
可以看到,代码崩掉了,这是为啥呢???
此时我们先需要自己写一个拷贝构造,完成拷贝
class _string
{
public:
_string(const char* str = " ")
{
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
_string(const _string& str)
:_str(new char[strlen(str._str)+1])
{
strcpy(_str, str._str);
}
void print()
{
cout << _str << endl;
}
~_string()
{
delete[]_str;
_str = nullptr;
}
private:
char* _str;
};
void test()
{
_string s1("hello world");
_string s2(s1);
s1.print();
s2.print();
}
完成拷贝
总结:
浅拷贝:编译器只是将对象中的值拷贝过来,会导致多个对象共享一份资源,当一个对象销毁时会将该资源释放,其他对象继续释放时,会发生违规访问。
深拷贝:给每一个对象分配独立的资源,保证对象之间的没有耦合度,一般要开辟新空间存储。