赋值运算符的重载函数:一定要注意避免发生浅拷贝(即多个指针指向同一块内存),赋值运算符一般是指给一个已经存在的对象赋上新的值,很容易发生浅拷贝现象,所以一定要注意哦。
代码如下:
#include<iostream>
#include<string.h>
using namespace std;
class CMyString
{
public:
CMyString(char *pdata = NULL)
{
if (pdata == NULL)
return ;
m_pdata = new char[strlen(pdata)+1];
strcpy(m_pdata,pdata);
cout<<m_pdata<<endl;
};
/普通赋值运算符的重载函数/
//1、参数要加const和&,用引用可以少用一次拷贝构造函数。
CMyString &operator =(const CMyString &src)//2、返回值的类型为引用,可以实现连续赋值
{
if (this == &src)//3、防止自拷贝
{
return *this;
}
delete []m_pdata;//4、记得释放原有内存
m_pdata = NULL;
m_pdata = new char[strlen(src.m_pdata)+1];
strcpy(m_pdata,src.m_pdata);
cout<<m_pdata<<endl;
return *this;
}
/升级版赋值运算符的重载函数/
//原因:普通版先释放原有的内存,再new,如果new失败,则也丢失了自己原来的数据,但是升级版
//如果new失败,也不会丢掉数据,因为它是在后面释放。
CMyString &operator=(const CMyString &src)
{
if(this != &src)
{
//申请一个新指针指向一块新内存
char *newp = new char[strlen(src.m_pdata)+1];
//把值拷贝构造一份
strcpy(newp,src.m_pdata);
//把指针进行交换
char *tmp = newp;
newp = m_pdata;
m_pdata = tmp;
delete []newp;
}
cout<<m_pdata<<endl;
return *this;
}
~CMyString()
{
if (m_pdata != NULL)
{
delete []m_pdata;
}
}
private:
char *m_pdata;
};
void main()
{
CMyString str1("chengfuying");
CMyString str2("chengfuyingmemeda");
CMyString str3("");
str2 = str2;
str2 = str1;
str2 = str3;
}