深浅拷贝与string类

本文详细介绍了C++中的深拷贝和浅拷贝概念,通过实例代码展示了两者的区别。浅拷贝仅复制对象的引用,导致修改一处会影响到另一处,可能导致内存问题。而深拷贝则创建了新的内存空间,确保对象独立。文中还提供了自定义string类的深拷贝构造函数和赋值运算符的实现,确保了拷贝的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深浅拷贝

深拷贝的就是多层拷贝对象或数组中的数据,浅拷贝的话就是拷贝一层数据
1、浅拷贝
浅拷贝就是只是把另一个变量的值拿过来;

int main()
{
	test::string s1("hello world!");
	test::string s2(s1);
	s2[0] = 'x';
	cout << s1.c_str() << endl;
	cout << s2.c_str() << endl;
}

如图&&代码:实现浅拷贝;先s1=“Hello world!",将s1的值赋给s2;可知s1与s2的地址一样,且修改其中一个字符串时,另一个也会随之改变。且运行会崩溃!(因为对同一段内存调用两次析构函数,第一次之后变为野指针)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.深拷贝
深拷贝就是重新开一块空间,将另一个变量的值放进这块新空间;(多层拷贝对象或数组中的数据)

namespace test
{
	class string
	{
		string(const string& s)
			//静态(const)的数据成员只能初始化而不能赋值,
			//同样引用类型也是只可以被初始化,那么只有用初始化列表。
			:_str(new char[strlen(s._str)+1])
		{
			strcpy(_str, s._str);
		}
	};
}
int main()
{
	test::string s1("hello world!");
	test::string s2(s1);
	s2[0] = 'x';
	cout << s1.c_str() << endl;
	cout << s2.c_str() << endl;
	/*test::string s3 = s2;
	cout << s3.c_str() << endl;*/

    return 0;
}

如图&代码:一个构造函数为s2新开出一块空间后,将s1的值放进s2中;可知s1与s2的地址不一样,且修改其中一个字符串时,另一个不会随之改变。且运行正常。
在这里插入图片描述
在这里插入图片描述

部分string代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <assert.h>
using namespace std;
//实现string类
//深浅拷贝
namespace test
{
	class string
	{
	public:
		//string(char* str = "\0")
		string(const char* str = "")
			:_str(new char[strlen(str) + 1])
		{
			strcpy(_str, str);
		}
		// string s2(s1)深拷贝
		string(const string& s)
			//静态(const)的数据成员只能初始化而不能赋值,
			//同样引用类型也是只可以被初始化,那么只有用初始化列表。
			:_str(new char[strlen(s._str)+1])
		{
			strcpy(_str, s._str);
		}
		// s3 = s1
		string& operator=(const string& s)
		{
			//防止自己给自己赋值,delete之后出现乱码
			if (this != &s)
			{
				delete[] _str;
				_str = new char[strlen(s._str) + 1];
				strcpy(_str, s._str);
			}
			return *this;
		}
		//析构
		~string()
		{
			delete[] _str;
			_str = nullptr;
		}
		//str[索引]=‘字符’
		char& operator[](size_t i)
		{
			return _str[i];
		}
		//返回_str
		const char* c_str()
		{
			return _str;
		}
	private:
		char* _str;
	};
}

int main()
{
	test::string s1("hello world!");
	test::string s2(s1);
	//operator[]使用
	s2[0] = 'x';
	cout << s1.c_str() << endl;
	cout << s2.c_str() << endl;
	//operator=使用
	test::string s3 = s2;
	cout << s3.c_str() << endl;

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值