对于定义一个赋值运算符函数时,需要注意一下几点:
(1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值
(2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函数内不会改变传入的实例状态
(3)一定要记得释放实例自身已有的内存,否则程序容易出现内存泄露
(4)注意传入的参数和当前的实例是不是同一个实例,如果是同一个,则不用进行赋值操作,直接返回即可。
经典解法:
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;
}
考虑异常安全性的解法及测试用例
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class CMyString
{
public:
CMyString(const char* pData = NULL);
CMyString(const CMyString& str);
CMyString& operator =(const CMyString& str);
~CMyString(void);
void print();
private:
char* m_pData;
};
CMyString::CMyString(const char* pData)
{
if(pData == NULL)
{
m_pData = new char[1];
strcpy(m_pData, "\0");
}
else
{
int length = strlen(pData);
m_pData = new char[length+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(void)
{
delete[] m_pData;
}
CMyString& CMyString::operator =(const CMyString& str)
{
if(this != &str)
{
CMyString strTemp(str);
char* pData = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pData;
}
return *this;
}
void CMyString::print()
{
cout << m_pData << endl;
}
//把一个CMyString的实例赋值给另外一个实例
void test1()
{
cout << "test1:" << endl;
const char* test = "hello world";
CMyString str1(test);
CMyString str2;
str2 = str1;
cout<<"The expected result is: ";
str1.print();
cout<<"the actual result is: ";
str2.print();
}
//把一个CMyString的实例赋值给它自己
void test2()
{
cout << "test2:" << endl;
const char* test = "hello world";
CMyString str1(test);
cout<<"The expected result is: ";
str1.print();
str1 = str1;
cout<<"the actual result is: ";
str1.print();
}
//连续赋值
void test3()
{
cout << "test3:" << endl;
const char* test = "hello world";
CMyString str1(test);
cout<<"The expected result is: ";
str1.print();
CMyString str2, str3;
str3 = str2 = str1;
cout<<"the actual result is: ";
str2.print();
str3.print();
}
int main()
{
test1();
test2();
test3();
return 0;
}