深浅拷贝
发布日期:2021-09-19 03:18:23 浏览次数:2 分类:技术文章

本文共 1789 字,大约阅读时间需要 5 分钟。

浅拷贝如图所示,定义的俩个变量同时指向同一块空间,这样析构时就会出错

浅拷贝的实现:

class String{public:	String(char* str =" ")//构造		:_str(str)	{		cout << "String()" << endl;	}	String(const String& s)//浅拷贝	{		cout << "浅拷贝" << endl;		_str = s._str;	}	~String()	{		cout << "~String" << endl;		delete[] _str;		_str = NULL;	}private:	char* _str;};int main(){	String t1;	String t2(t1);	system("pause");	return 0;}

同一块空间释放俩次时就会奔溃

深拷贝就是用来解决这一问题的,在拷贝的同时开一块空间

传统写法:

class String{public:	String(const char* str = " ")	{		if (str == NULL)		{			_str = new char[1];			*_str = '\0';		}		else		{			_str = new char[strlen(str) + 1];			strcpy(_str, str);		}	}	String(const String& str)		:_str(NULL)	{		if (str._str != NULL)		{			_str = new char[strlen(str._str)+1];			strcpy(_str, str._str);		}	}	//赋值运算符重载	String &operator=(const String str)	{		if (_str == NULL)//原来的为空就不需要delete		{			_str = new char[strlen(str._str)+1];			strcpy(_str, str._str);		}		/*else		{			delete[] _str;   //delet原来的			_str = new char[strlen(str._str) + 1];//构建新的空间			strcpy(_str, str._str);拷贝		}      构建新空间时可能会没有开成功		*/		else//原来的不为空需要delete,但要先创建好空间否则会出错		{			char* tmp = new char[strlen(str._str) + 1];			strcpy(tmp, str._str);			delete _str;			_str = tmp;		}		return *this;	}	~String()//析构函数	{		if (_str != NULL)		{			delete[] _str;			_str = NULL;		}	}private:	char *_str;};
现代写法:

class String{public:	String(const char* str=" ")	{		if (str == NULL)		{			_str = new char[1];			*_str = '/0';		}		else		{			_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=(const String s)	{		if (_str != s._str)		{			String tmp(s);			swap(_str, tmp._str);		}		return *this;	}	~String()	{		if (_str != NULL)		{			delete[] _str;			_str = NULL;		}	}private:	char *_str;};

转载地址:https://blog.csdn.net/audience_fzn/article/details/78497984 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:智能指针(二)之auto_ptr
下一篇:二叉树

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月03日 08时38分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

boost::function_types::is_member_function_pointer的用法测试程序 2019-04-26
boost::function_types::is_function_pointer用法的测试程序 2019-04-26
SpringMVC框架学习总结 2019-04-26
boost::function_types::is_function_reference的测试程序 2019-04-26
boost::function_types::is_function用法的测试程序 2019-04-26
boost::function_types::is_member_function_pointer用法的测试程序 2019-04-26
boost::geometry::clear用法的测试程序 2019-04-26
asp 指定读取前几条记录 2019-04-26
大数据_Hbase-API访问_Java操作Hbase_MR-数据迁移-代码测试---Hbase工作笔记0017 2019-04-26
大数据_Hbase-内容回顾和补充---Hbase工作笔记0018 2019-04-26
大数据_Hbase-内容回顾_知识点补充_线程安全与wait的区别---Hbase工作笔记0019 2019-04-26
大数据_Hbase-Filter & 索引(优化)_根据column查询---Hbase工作笔记0020 2019-04-26
大数据_MapperReduce_从CSV文件中读取数据到Hbase_自己动手实现Mapper和Reducer---Hbase工作笔记0021 2019-04-26
大数据_MapperReduce_协处理器_类似Mysql的触发器---Hbase工作笔记0024 2019-04-26
大数据_MapperReduce_Hbase的优化_存数据_自动计算分区号 & 自动计算分区键---Hbase工作笔记0027 2019-04-26
大数据_MapperReduce_Hbase的优化_RowKey设计原则---Hbase工作笔记0028 2019-04-26
大数据_MapperReduce_Hbase的优化和Hbase相关面试题_以及hbase的javaapi的一部分源码---Hbase工作笔记0029 2019-04-26
大数据_MapperReduce_Hbase配置参数说明_以及部分源码说明---Hbase工作笔记0031 2019-04-26
Vue介绍---vue工作笔记0001 2019-04-26
Vue基本使用---vue工作笔记0002 2019-04-26