对C++成员函数级联调用的一点问题

在C++成员函数级联调用时为什么一定要加&?比如下面这段代码:

#include <iostream>
using namespace std;
class Number
{
public:
    Number(int a)
    {
        x = a;
    }
    Number add(int a)
    {
        x += a;
        return *this;
    }
    void print()
    {
        cout << x<<endl;
    }
private:
    int x;
};
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    Number n(a);
    n.add(b).add(c);
    n.print();
}

输入3,4,5,输出7,只是加了前两个数,如果在Number类的add前面加上&则可得出正确结果,这个&到底有什么作用一定要加?

c++

3个回答

图中那个add函数,返回的是一个*this ,this是一个该对象的地址,*this是一个值向该对象的地址,在主函数中n.add(b)返回的是一个指向该对象的临时变量,可以理解为是一种对象的拷贝,当你再执行add(c)时,对象就是拷贝的临时变量了,当你下面执行的print函数时,使用的还是原来的变量,不是临时变量。
可能我说的有点乱,看一下这个吧https://www.cnblogs.com/strivingforever/p/8527301.html 希望对你有帮助

&在C++里可以作为引用,它功能像指针但又不同。
add 前面加上&,表示add返回值是一个对象的引用,也就是n本身。
如果不加&,则返回的是一个临时对象,也就是第二次的add的作用的对象是这个临时对象,并不是原始的n这个对象。也就导致n对象只进行了一次add操作。

主要是add函数返回值的原因。
以类型A为例,方法中return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。return this返回当前对象的地址(指向当前对象的指针)

默认情况下,此函数Number add(int a)返回的是Number对象的克隆/拷贝,对象本身确实变化了,但是后续add是针对克隆/拷贝对象进行的。
比较好的的解决方式,声明修改为Number& add(int a)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问