注册 登录
编程论坛 C++教室

赋值运算符重载返回值和参数类型问题

Nexcuse 发布于 2021-02-24 14:52, 1593 次点击
问题描述:对于自定义类型来说,赋值运算符重载时函数返回值和参数类型为什么一定要是引用类型呢?注释部分是我自己的理解,请各位大神帮忙看看有什么错误帮忙指正一下,先谢谢各位了。
程序代码:

#include<iostream>
using namespace std;

 
//赋值运算符重载
class Person
{
public:
    Person(int age)
    {
        m_Age = new int(age);
         
    }

 
     //参数必须是引用类型,若是值类型,在函数结束时会执行析构函数把指针(传入的对象的m_Age这个指针成员)指向的内存空间释放掉.
    Person& operator=(Person &p) //返回值必须是引用的个人理解在下方 test01 函数中
    {

 
        //如果有未释放的堆区空间,先释放
        if (m_Age != NULL)
        {
            delete m_Age;
            m_Age = NULL;
        }

 
        m_Age = new int(*p.m_Age);
        return *this;
    }

 
    ~Person()
    {
        if (m_Age != NULL)
        {
            delete m_Age;
            m_Age = NULL;
        }
    }

 
    int *m_Age;
};

 
void test01()
{
    Person p1(18);
    Person p2(20);
    Person p3(30);

 
    p3 = p2 = p1;

 
    //对于自定义数据类型,等号运算符重载返回值必须是引用类型
   
//如上方代码相当于p3.operator=(p2.operator=(p1));,其中参数传递过程,即 Person &p = p2.operator=(p1);,如果operator= 函数返回的是值
   
//则会先在内存中创建一个临时对象temp用于接收传递来的对象副本,然后用这个临时对象为引用p初始化
   
//而临时对象声明周期很短,仅在当前语句结束后就释放其内存空间,而后再通过p访问临时变量的内存空间则是非法操作。

    cout << "p1的年龄为:" << *p1.m_Age << endl;

 
    cout << "p2的年龄为:" << *p2.m_Age << endl;

 
    cout << "p3的年龄为:" << *p3.m_Age << endl;
}

 
int main(void)
{
    test01();
    system("pause");
    return 0;
}



[此贴子已经被作者于2021-2-24 14:57编辑过]

3 回复
#2
rjsp2021-02-24 22:24
不是必须,就是为了顺应习俗而已。
内建型别可以 a=b=c,那自定义型别何必标新立异
#3
Nexcuse2021-02-28 23:16
回复 2楼 rjsp
但是大神我参数或者是返回值去掉都会出错
错误提示:

case1:当返回值不是引用类型时提示:

错误        C2679        二进制“=”: 没有找到接受“Person”类型的右操作数的运算符(或没有可接受的转换)        

case2 :当参数不是引用类型时会抛出异常
#4
rjsp2021-03-02 10:49
假如你需要像内建类型一样可以 p3 = p2 = p1 的话,那你就需要返回引用,否则就不需要返回引用。
1