#include <iostream>
using namespace std;
class MyString
{
public:
MyString();
MyString(const char *pStr);
MyString(const MyString &str);
MyString &operator=(const MyString&str);
virtual ~MyString();
private:
char *data;
};
MyString::MyString()
{
data = new char[1];
data[0] = '\0';
}
MyString::MyString(const char *pStr)
{
if (pStr == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
}
MyString::MyString(const MyString &str)
{
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
}
MyString&MyString::operator=(const MyString &str)
{
//如果等号右边是自身 则直接返回自身
if (&str == this)
{
return *this;
}
else
//先释放原字符串空间 然后重新申请空间 赋值
{
delete[]data;
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
return *this;
}
{
delete []data;
}
using namespace std;
class MyString
{
public:
MyString();
MyString(const char *pStr);
MyString(const MyString &str);
MyString &operator=(const MyString&str);
virtual ~MyString();
private:
char *data;
};
MyString::MyString()
{
data = new char[1];
data[0] = '\0';
}
MyString::MyString(const char *pStr)
{
if (pStr == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
}
MyString::MyString(const MyString &str)
{
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
}
MyString&MyString::operator=(const MyString &str)
{
//如果等号右边是自身 则直接返回自身
if (&str == this)
{
return *this;
}
else
//先释放原字符串空间 然后重新申请空间 赋值
{
delete[]data;
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
return *this;
}
}
//在上面赋值运算符中 先删去了data原来指向的内容 但如果接下来内存不足 导致new char失败 抛出异常
//data将会是一个空指针 导致程序崩溃 更好的办法:先创建一个临时实例,再交换临时实例和原来的实例
MyString& MyString::operator=(const MyString &str)
{
if(this!=&str)
{
MyString temp(str);
char *p_data=temp.data;
temp.data=data;
data=p_data;
}
return *this;
}
MyString::~MyString(){
delete []data;
}