拷貝構造的實現方式
- 先釋放掉_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;
}