C++:String对象的构造及深拷贝

   日期:2020-10-08     浏览:97    评论:0    
核心提示:C++中String对象的构造以及深拷贝拷贝构造的实现方式先释放掉_str的内存,然后再申请一个要拷贝的内存空间,再将原对象的值拷贝到目标对象中#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<string>#include<list>#include<assert.h>#include<vld.h>using namespace std;names

C++中String对象的构造以及深拷贝

拷贝构造的实现方式

  1. 先释放掉_str的内存,然后再申请一个要拷贝的内存空间,再将原对象的值拷贝到目标对象中
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<list>
#include<assert.h>
#include<vld.h>
using namespace std;

namespace bit
{ 
	class string
	{ 
	public:
		string(const char* str = "")
		{ 
			if (nullptr == str)
				_str = new char[1]{  '\0' };
			else
			{ 
				_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);
			}
			return *this;
		}
		~string()
		{ 
			if (_str)
			{ 
				delete[] _str;
				_str = nullptr;
			}
		}
	private:
		char* _str;
	};
};
int main()
{ 
	bit::string str(nullptr);
	bit::string str1("abc");
	bit::string str2;
	str2 = str1;
	system("pause");
	return 0;
}

  1. 构造一个临时对象,再交换两个容器内所有元素,再返回交换后的_str对象的值
string& operator=(const string &s)
		{ 
			if (this != &s)
			{ 
				string tmp_str(s);    //临时对象
				swap(_str, tmp_str._str);
			}
			return *this;
		}
	

  1. 为了防止因申请空间失败而破坏要拷贝的原对象,对第一种方法进行改进
string& operator=(const string &s)
		{ 
			if (this != &s)
			{ 
				char *tmp_str = new char[strlen(s._str) + 1];  //ERROR
				delete[]_str;
				_str = tmp_str;
				strcpy(_str, s._str);
			}
			return *this;
		}

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服