为什么赋值运算符要防止自身赋值

本文探讨了C++中赋值运算符重载时防止自身赋值的重要性,并提供了两种有效的方法来避免这一问题,确保程序的健壮性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么赋值运算符要防止自身赋值呢??
如果类里面含有指针指向动态分配的资源的话,那么自身赋值就可能出错
有可能导致把自己给释放了

如下面:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
class A
{
public:
    char *ptr;
    A(){ptr = nullptr;}
    void set_ptr(char *str){ptr = new char[strlen(str)+1]; strcpy(ptr,str);}
    A& operator=(const A&rhs)
    {
        
        delete ptr;
        ptr = new char[strlen(rhs.ptr)+1];
        strcpy(ptr,rhs.ptr);
        return *this;
    }
};
int main()
{
    A a;
    a.set_ptr("hello world");
    a = a;
    cout<<a.ptr<<endl;
}
//导致输出错误

下面有几种办法
1、判断参数是否是自身
那么就要重载==或者!=运算符
if(*this != rhs)
该运算符不止要判断数据成员的值是否相等
还要判断ptr的指向(即ptr的指针值是否相等)
那么这样的运算符失去了一般性(没必要判断ptr的指针值是否相等,而是判断指向的内容是否相等)

2、即先将右操作数的内容赋值到一个临时指针
然后释放左操作数指针指向的内存
然后将临时指针赋给左操作数的指针

class A
{
public:
    char *ptr;
    A(){ptr = nullptr;}
    void set_ptr(char *str){ptr = new char[strlen(str)+1]; strcpy(ptr,str);}
    Aoperator=(const A&rhs)
    {
        
        char *temp = new char[strlen(rhs.ptr)+1];//复制资源到一个临时指针
        strcpy(temp,rhs.ptr);
        delete ptr;
        ptr = temp;
        return *this;
    }
};


当然了,具体情况还是得针对类的具体实现来考虑
明白这个思想就行了
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值