鱼C论坛

 找回密码
 立即注册
查看: 884|回复: 9

[已解决]小白求助 关于返回引用的疑问 请大佬过目

[复制链接]
发表于 2020-4-3 18:29:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. Array& Array::operator=(Array& a)
  2. {
  3.         if (this->m_space != NULL)
  4.         {
  5.                 delete[] this->m_space;
  6.                 this->m_len = 0;
  7.         }
  8.         this->m_len = a.m_len;
  9.         this->m_space = new int[m_len];
  10.         for (int i = 0; i < m_len; ++i)
  11.         {
  12.                 this->m_space[i] = a.m_space[i];
  13.         }
  14.         return *this;  问题:等号操作符重载  这里什么时候 返回*this,什么时候 返回 a?
  15. }
复制代码
最佳答案
2020-4-4 10:32:55
本帖最后由 倒戈卸甲 于 2020-4-4 10:48 编辑

首先,返回值类型是由函数名前面的那个Array[]来声明的,这个声明就是返回引用。所以return a和return *this都是在返回引用(引用的语法就是这样,只要有&符号,普通变量和*p都成立为引用)。
于是那么,前者返回的是传入的对象的引用,后者返回的是对象自身的引用。举个例子,你在对象b的方法中,传入参数为对象a的引用,却又返回了对象a的引用,这肯定没有任何意义。但如果返回*this,也就是返回b自身的引用,这就很意义了,因为引用的本质是地址传递,那外部就可以对象b的地址,b的属性和方法都能被接收。
这其实也是c++非常推荐的语法,简洁又可靠,要彻底弄明白这段代码,你可以每天都使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-3 18:37:00 | 显示全部楼层
一直返回 *this
不能返回 a,不然可能造成递归调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 18:38:53 | 显示全部楼层
BngThea 发表于 2020-4-3 18:37
一直返回 *this
不能返回 a,不然可能造成递归调用

哦哦 知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 18:39:54 | 显示全部楼层
BngThea 发表于 2020-4-3 18:37
一直返回 *this
不能返回 a,不然可能造成递归调用

返回a怎么造成的递归调用呢?
不是返回a的引用 就是a自身 相当于左值
然后怎么自己调自己呢 大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 19:36:07 | 显示全部楼层
琴长不过时光 发表于 2020-4-3 18:39
返回a怎么造成的递归调用呢?
不是返回a的引用 就是a自身 相当于左值
然后怎么自己调自己呢 大佬

我是说可能,因为我没试过
因为你返回的本身也是类对象的引用,所以可能造成递归调用自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 20:01:28 | 显示全部楼层
BngThea 发表于 2020-4-3 19:36
我是说可能,因为我没试过
因为你返回的本身也是类对象的引用,所以可能造成递归调用自身

哦哦 谢谢大佬了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-4 10:32:55 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 倒戈卸甲 于 2020-4-4 10:48 编辑

首先,返回值类型是由函数名前面的那个Array[]来声明的,这个声明就是返回引用。所以return a和return *this都是在返回引用(引用的语法就是这样,只要有&符号,普通变量和*p都成立为引用)。
于是那么,前者返回的是传入的对象的引用,后者返回的是对象自身的引用。举个例子,你在对象b的方法中,传入参数为对象a的引用,却又返回了对象a的引用,这肯定没有任何意义。但如果返回*this,也就是返回b自身的引用,这就很意义了,因为引用的本质是地址传递,那外部就可以对象b的地址,b的属性和方法都能被接收。
这其实也是c++非常推荐的语法,简洁又可靠,要彻底弄明白这段代码,你可以每天都使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 14:28:18 | 显示全部楼层
倒戈卸甲 发表于 2020-4-4 10:32
首先,返回值类型是由函数名前面的那个Array[]来声明的,这个声明就是返回引用。所以return a和return *thi ...

谢谢大佬了 有点明白了 慢慢学吧 想一次性搞懂难度估计有点大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 11:41:32 | 显示全部楼层
本帖最后由 howzyao 于 2020-4-6 11:42 编辑

我深深的复习了楼主的深复制,回顾到了重载赋值号。谢谢
只是,能否将入参对像写为:const Array &a 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 11:47:12 | 显示全部楼层
howzyao 发表于 2020-4-6 11:41
我深深的复习了楼主的深复制,回顾到了重载赋值号。谢谢
只是,能否将入参对像写为:const Array &a 呢?

我个人以为 一般 拷贝构造函数才后面写const Array& a吧  普通的操作符重载一般写Array &a 不一定正确 不过我看的视频是这样写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 04:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表