<strong>经典的初级解法:</strong>
#include<iostream>
using namespace std;
class cMyString {
private:
char * m_pData;
public:
cMyString(const char * pData) {
if(pData == NULL) {
m_pData = new char[strlen(pData) + 1];
m_pData[0] = '\0';
}
else {
m_pData = new char[strlen(pData) + 1];
strcpy(m_pData, pData);
}
}
cMyString::cMyString(const cMyString &str)
{
int length = strlen(str.m_pData);
m_pData = new char[length + 1];
strcpy(m_pData, str.m_pData);
}
cMyString& cMyString::operator = (const cMyString &str) {
if(this == &str) {
return *this;
}
delete []m_pData;
m_pData = NULL;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
cMyString(void) {
if(m_pData != NULL) {
delete[] m_pData;
}
}
void cMyString::print() {
printf("%s\n", m_pData);
}
};
int main() {
cMyString S1("");
cMyString S3("sssss");
cMyString S2(S3);
cMyString S4 = S1;
S1.print();
S2.print();
S3.print();
S4.print();
return 0;
}
考虑异常安全性的解法:
在上述方法中, 我们先delete掉了m_pData中的内容, 如果此时内存不足以new出要求长度的m_pData时抛出异常, m_pData将是一个空指针, 很容易导致程序崩溃。
cMyString& cMyString::operator = (const cMyString &str) {
if(this != &str) {
cMyString strTemp(str);
char* pTemp = strTemp.m_pData; //swap(m_pData, pTemp);
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
}