#include <string.h>
#include <iostream>
using namespace std;
class String {
public:
String(const char *str=NULL);
String(const String &another);
String &operator=(const String &rhs);
~String();
void print() {
cout << m_data << endl;
}
int Compare(const String &rhs);
private:
char *m_data;
};
String::String(const char *str) {
if (str) {
m_data = new char[sizeof(str) + 1];
strcpy(m_data, str);
} else {
m_data = NULL;
}
}
String::String(const String &another) {
if (another.m_data) {
m_data = new char[sizeof(another.m_data) + 1];
strcpy(m_data, another.m_data);
} else {
m_data = NULL;
}
}
String& String::operator=(const String &rhs) {
if (this == &rhs) {
return *this;
}
if (!this->m_data) {
delete []m_data;
}
if (rhs.m_data) {
m_data = new char[sizeof(rhs.m_data) + 1];
strcpy(m_data, rhs.m_data);
} else {
m_data = NULL;
}
return *this;
}
String::~String() {
if (m_data) {
delete []m_data;
}
}
int String::Compare(const String &rhs) {
return strcmp(m_data, rhs.m_data);
}
int main() {
char a[] = {"abcdefg"};
String str1(a);
str1.print();
String str2(str1);
str2.print();
String str3 = str2;
str3.print();
str1.print();
cout << str1.Compare(str2);
return 0;
}
上面的赋值运算符其实是有问题的,如果new
操作运算符执行失败,则原先的内存已然被释放掉了,导致左值清空。避免这种情况发生,可以使用以下方法处理:
- 先创建一个临时实例,再交换临时实例和原来实例。(参见剑指offer 26页)
String& String::operator=(const String &rhs) {
if (m_data != rhs.m_data) {
String strTemp(rhs);
// 借助中间值进行交换
char *cTemp = strTemp.m_data;
strTemp.m_data = m_pData;
m_data = cTemp;
}
return *this;
}
- 先申请再释放,如果申请失败,则不释放
String& String::operator=(const String &rhs) {
if (m_data != rhs.m_data) {
char *pTemp = m_data;
m_data = new char[sizeof(rhs.m_data) + 1];
if (m_data) {
delete []pTemp;
strcpy(m_data, rhs.m_data);
} else {
m_data = pTemp;
}
}
return *this;
}
关注我的公众号