C++中String对象的构造以及深拷贝
拷贝构造的实现方式
- 先释放掉_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;
}
- 构造一个临时对象,再交换两个容器内所有元素,再返回交换后的_str对象的值
string& operator=(const string &s)
{
if (this != &s)
{
string tmp_str(s); //临时对象
swap(_str, tmp_str._str);
}
return *this;
}
- 为了防止因申请空间失败而破坏要拷贝的原对象,对第一种方法进行改进
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;
}