赋值运算符函数

这里写图片描述

注意点
  • 返回值类型为该类型的引用,并且在函数结束时返回实例自身的引用(*this)

    只有返回一个引用才允许连续赋值(链式访问)

  • 参数的类型声明为常量引用

    1.如果传入的参数不是引用而是实例,那么从形参到实参会调用拷贝构造函数,降低代码效率。(传引用不需调用拷贝构造函数)
    2.在函数体内不会改变传入的实例(引用前加const)

  • 释放实例自身已有的内存(防止内存泄漏)

  • 判断传入参数与当前实例是否为同一个实例

    当传入的参数与*this是同一个实例,一旦释放自身的内存,参数的内存将一同释放,将找不到需要赋值的内容

class Mystring
{
public:
    Mystring()
        :p_data(0)
    {}
    Mystring(const Mystring& str)
    {
        p_data = str.p_data;
    }
    Mystring& operator = (const Mystring & s);
    ~Mystring(void)
    {
        if (NULL == p_data)
        {
            delete[] p_data;
            p_data = NULL;
        }
    }
private:
    char* p_data;
};
LOW
Mystring& Mystring::operator = (const Mystring & s)
{
    if (this == &s)//判断参数和当前实例是不是相同
        return *this;
    delete[] p_data;//释放实例
    p_data = NULL;//置空
    p_data = new char[strlen(s.p_data) + 1];//重新开辟空间
    strcpy(p_data,s.p_data);//将参数数据拷贝到当前实例数据
    return *this;
}
GOOD
Mystring& Mystring::operator = (const Mystring & s)
{
    if (this != &s)//判断参数和当前实例是不是相同
    {
        Mystring pTmp(s);创建一个临时实例
        char *tmp = pTmp.p_data;
        pTmp.p_data = p_data;
        p_data = tmp;
    }
    return *this;
}
//临时变量除了作用域将自动调用析构函数进内存释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值