深浅拷贝与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类的主要内容,如果未能解决你的问题,请参考以下文章