| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1390 人关注过本帖
标题:赋值运算符重载返回值和参数类型问题
只看楼主 加入收藏
Nexcuse
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-2-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
赋值运算符重载返回值和参数类型问题
问题描述:对于自定义类型来说,赋值运算符重载时函数返回值和参数类型为什么一定要是引用类型呢?注释部分是我自己的理解,请各位大神帮忙看看有什么错误帮忙指正一下,先谢谢各位了。
程序代码:
#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编辑过]

搜索更多相关主题的帖子: Person 类型 运算符重载 返回值 参数 
2021-02-24 14:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:20 
不是必须,就是为了顺应习俗而已。
内建型别可以 a=b=c,那自定义型别何必标新立异
2021-02-24 22:24
Nexcuse
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-2-24
收藏
得分:0 
回复 2楼 rjsp
但是大神我参数或者是返回值去掉都会出错
错误提示:

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

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

case2 :当参数不是引用类型时会抛出异常
2021-02-28 23:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
假如你需要像内建类型一样可以 p3 = p2 = p1 的话,那你就需要返回引用,否则就不需要返回引用。
2021-03-02 10:49
快速回复:赋值运算符重载返回值和参数类型问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021327 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved