我们在http://write.blog.csdn.net/postedit/68495670博客中描述了string类的深浅拷贝问题,现在我们了解深拷贝两个版本,一个是传统写法,另一个是现代写法。
1,传统写法:
#include<iostream>
using namespace std;
class Mystring
{
public:
Mystring(char* str)//初始化
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
Mystring(const Mystring& s)//深拷贝构造
:_str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
Mystring& operator=(const Mystring& s)//赋值运算符的重载
{
if (this != &s)//防止自己给自己赋值
{
delete[] _str;
_str = new char[strlen(s._str) + 1];
strcpy(_str, s._str);
}
return *this;
}
~Mystring()
{
delete[] _str;
_str = NULL;
}
protected:
char _buffer[16];
size_t _size;
char* _str;
size_t _capacity;
};
2,现代写法:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Mystring
{
public:
Mystring(char* str)
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
Mystring(const Mystring& s)//拷贝构造
:_str(NULL)
{
Mystring tmp(s._str);
swap(_str, tmp._str);
}
Mystring& operator=(const Mystring& s)
{
if (this != &s)
{
Mystring tmp(s._str);
swap(_str, tmp._str);
}
return *this;
}
~Mystring()
{
delete[] _str;
_str = NULL;
}
protected:
char _buffer[16];
size_t _size;
char* _str;
size_t _capacity;
};