琴长不过时光 发表于 2020-4-3 18:29:50

小白求助 关于返回引用的疑问 请大佬过目

Array& Array::operator=(Array& a)
{
        if (this->m_space != NULL)
        {
                delete[] this->m_space;
                this->m_len = 0;
        }
        this->m_len = a.m_len;
        this->m_space = new int;
        for (int i = 0; i < m_len; ++i)
        {
                this->m_space = a.m_space;
        }
        return *this;问题:等号操作符重载这里什么时候 返回*this,什么时候 返回 a?
}

BngThea 发表于 2020-4-3 18:37:00

一直返回 *this
不能返回 a,不然可能造成递归调用

琴长不过时光 发表于 2020-4-3 18:38:53

BngThea 发表于 2020-4-3 18:37
一直返回 *this
不能返回 a,不然可能造成递归调用

哦哦 知道了

琴长不过时光 发表于 2020-4-3 18:39:54

BngThea 发表于 2020-4-3 18:37
一直返回 *this
不能返回 a,不然可能造成递归调用

返回a怎么造成的递归调用呢?
不是返回a的引用 就是a自身 相当于左值
然后怎么自己调自己呢 大佬

BngThea 发表于 2020-4-3 19:36:07

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

我是说可能,因为我没试过
因为你返回的本身也是类对象的引用,所以可能造成递归调用自身

琴长不过时光 发表于 2020-4-3 20:01:28

BngThea 发表于 2020-4-3 19:36
我是说可能,因为我没试过
因为你返回的本身也是类对象的引用,所以可能造成递归调用自身

哦哦 谢谢大佬了

倒戈卸甲 发表于 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++非常推荐的语法,简洁又可靠,要彻底弄明白这段代码,你可以每天都使用

琴长不过时光 发表于 2020-4-4 14:28:18

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

谢谢大佬了 有点明白了 慢慢学吧 想一次性搞懂难度估计有点大

howzyao 发表于 2020-4-6 11:41:32

本帖最后由 howzyao 于 2020-4-6 11:42 编辑

我深深的复习了楼主的深复制,回顾到了重载赋值号。谢谢
只是,能否将入参对像写为:const Array &a 呢?

琴长不过时光 发表于 2020-4-6 11:47:12

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

我个人以为 一般 拷贝构造函数才后面写const Array& a吧普通的操作符重载一般写Array &a 不一定正确 不过我看的视频是这样写的
页: [1]
查看完整版本: 小白求助 关于返回引用的疑问 请大佬过目