string类的简单模拟实现
- 主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。
深浅拷贝
1.浅拷贝:
(1)也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进行操作时,就会发生发生了访问违规。
(2)如果string类中没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造。最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一块空间被释放多次而引起程序崩溃。
string s1("hello bit!!!");
string s2(s1);
2.深拷贝:
如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。
代码实现
#include<iostream>
using namespace std;
//模拟实现string
namespace lhw
{
class string
{
private:
char* _str;
public:
/*string(const char* str)
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
string()
:_str(new char[1])
{
_str[0] = '\0';
}*/
string(const char* str="") //全缺省 ""表示'\0'
:_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)
{
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._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];
}
const char* c_str()
{
return _str;
}
};
}