赋值运算符的重载函数

赋值运算符的重载函数:一定要注意避免发生浅拷贝(即多个指针指向同一块内存),赋值运算符一般是指给一个已经存在的对象赋上新的值,很容易发生浅拷贝现象,所以一定要注意哦。

代码如下:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值