赋值运算符函数
1
2
3
4
5
6
7
8
9
10
11
class CMyString {
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator =(const CMyString &str);
private:
char* m_pData;
};
赋值运算符函数的目的在于将另一个对象拷贝到当前对象中,值得注意的点包括
- 深拷贝和浅拷贝
- 内存分配
基于深拷贝和浅拷贝:
如果只是简单的将拷贝对象的值赋值到被拷贝对象中,那么两个对象的指针指向同一块内存,内存释放时容易发生多次释放而导致出问题,对此选择的方式是深拷贝,也就是将当前对象原来的值释放,重新分配一块新的内存。
同时需要注意,如果两个实例是同一个的话,直接返回实例就好,否则释放之后再进行拷贝会因为找不到实例的值而出错。
1
2
3
4
5
6
7
8
9
10
11
12
// 深拷贝
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;
}
关于内存分配:
上面函数欠缺部分在于异常处理,如果new失败会造成不好的后果,因此可以考虑另一种方案,创建一个临时实例,和当前变量交换即可。临时实例创建在栈中,局部函数结束时会自动释放。
1
2
3
4
5
6
7
if (*this != &str) {
CMyString strTemp(str);
char *pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;