c++中类中有默认的构造函数,其中就有拷贝构造,默认的拷贝构造按照字节进行拷贝,
按字节拷贝的问题在于:如果该空间为指针变量,且指向一块正在管理的空间,当浅拷贝之后,就会有两个变量同时管理这块空间,当生命周期结束后,也会随之析构两次,这是不允许的。
因此这种情况下,我们需要手动实现拷贝构造,简单来说,我们需要开辟空间,将原来管理的空间赋值一份,这样,一人一份就没有纠纷了。
string深拷贝的实现,以及传深拷贝统写法与现代写法。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
namespace mystring {
class string {
public:
//传统写法与现代写法
string(const char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
string(const string& str)
:_str(new char[strlen(str._str) + 1])
{
strcpy(_str, str._str);
}
string& operator=(const string& str) {
if (this != &str) {
string tmp(str._str);
swap(tmp._str, _str);
}
return *this;
}
string& operator=(string str) {//传值一次性拷贝
if (this != &str) {
swap(str._str, _str);
}
return *this;
}
//传统写法
string& operator=(const string& str) {
if (&str != this) {
char* tmp = new char[strlen(str._str) + 1];
strcpy(tmp, str._str);
delete[] _str;
_str = tmp;
}
return *this;
}
~string() {
delete[] _str;
_str = nullptr;
}
size_t size() {
return strlen(_str);
}
char& operator[](size_t i) {
return _str[i];
}
private:
char* _str;
};
}
int main() {
system("pause");
return 0;
}