C++关于浅拷贝、深拷贝以及写时拷贝的认识

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;

};

都是可以的。不难看出,后面这种写法的可读性更高,但是我建议多用第一种写法。

再其次就是写时拷贝;

写时拷贝有点像现在的大多数人----拖延症

其实它和浅拷贝还有点像,就是当资源内容一样时,它就浅拷贝一样,多个对象共享一份资源,但当某个对象要对这个资源进行改变的时候,再进行拷贝修改。

猜你喜欢

转载自blog.csdn.net/Sherlock_Provence/article/details/86435425