深浅拷贝与string类

Posted mbf330

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深浅拷贝与string类相关的知识,希望对你有一定的参考价值。

深浅拷贝

深拷贝的就是多层拷贝对象或数组中的数据,浅拷贝的话就是拷贝一层数据
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;

以上是关于深浅拷贝与string类的主要内容,如果未能解决你的问题,请参考以下文章

C++ 深浅拷贝写时拷贝

C++ 深浅拷贝写时拷贝

[C/C++]详解STL容器1--string的功能和模拟实现(深浅拷贝问题)

深浅拷贝——string

深浅拷贝问题

C++入门篇string的模拟实现