C++中拷贝分为浅拷贝、深拷贝、写时拷贝。
浅拷贝:又称位拷贝,是将别人的指针拷贝过来,从而使得多个对象共享一份资源。
这就是string调用默认拷贝构造函数出现的问题,最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一块 空间被释放j引起程序崩溃
接下来我们来说说深拷贝,深拷贝是重新开辟一块空间,将别人的内容拷贝过来,这样就不会出现浅拷贝出现的问题了
接下来就用string来实现一下深拷贝;
class String
{
public:
String(const char* str = "")
{
_size = strlen(str);
_capacity = _size > 15 ? _size : 15;
_str = new char[_capacity + 1];
strcpy(_str, str);
}
~String()
{
delete[] _str;
_str = nullptr;
_size = _capacity = 0;
}
String(const String& s)
:_str(nullptr)
, _size(0)
, _capacity(0)
{
String tmp(s._str);
this->Swap(tmp);
}
void Swap(String& s)
{
swap(_str, s._str);
swap(_size, s._size);
swap(_capacity, s._capacity);
}
private:
char* _str;
size_t _size;
size_t _capacity;
};
或者这样写:
class String
{
public:
String(const char* str = "")
{
if (nullptr == str)
{
assert(false);
return;
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
String(const String& s)
: _str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
String& operator=(const String& s)
{
if (this != &s)
{
char* pStr = new char[strlen(s._str) + 1];
strcpy(pStr, s._str);
delete[] _str;
_str = pStr;
}
return *this;
}
~String()
{
if (_str)
{
delete[] _str;
_str = nullptr;
}
}
private:
char* _str;
};
都是可以的。不难看出,后面这种写法的可读性更高,但是我建议多用第一种写法。
再其次就是写时拷贝;
写时拷贝有点像现在的大多数人----拖延症
其实它和浅拷贝还有点像,就是当资源内容一样时,它就浅拷贝一样,多个对象共享一份资源,但当某个对象要对这个资源进行改变的时候,再进行拷贝修改。