c++:深浅拷贝总结(深拷贝的传统和现代写法)

深浅拷贝区别:

  • 浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间
  • 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝
  • 调用拷贝构造函数后,浅拷贝还有联系,深拷贝的两个对象完全独立。
  • 浅拷贝类似于文件创建快捷方式,而深拷贝好比文件复制。
  • 编译器默认提供的默认拷贝构造函数是浅拷贝,深拷贝的构造函数需自己实现。

注意:浅拷贝多个对象共用一个资源,当一个对象销毁时,资源就会释放。如果对另一个对在进行销毁。会因为资源重复释放造成程序崩溃!

     

深拷贝的传统和现代写法:

传统写法:开辟空间复制内容

class String
{
public:
	String(const char* str = "")
		:_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)
		{
			delete[] _str;
			_str = new char[strlen(s._str) + 1];
			strcpy(_str,s._str);
			//方法二:
			/*char* tmp = new char[strlen(s._str) + 1];
			strcpy(tmp, s._str);
			delete[] _str;
			_str = tmp;*/
		}
		return *this;
	}
	~String() 
	{
		delete[] _str;
	}
	
private:
	char* _str;
};

现代写法:借助指针交换

class String
{
public:
	String(const char* str = "")
		:_str(new char[strlen(str) + 1])
	{
		strcpy(_str,str);
	}
	String(const String& s)
		:_str(NULL)
	{
		String tmp(s._str);
		swap(_str,tmp._str);
	}
	String& operator=(String s)
	{
		swap(_str,s._str);
		return *this;
	}
	~String()
	{
		delete[] _str;
	}
private:
	char* _str;
};

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/82717894
今日推荐