qq_43415720
qq_43415720
采纳率100%
2019-05-10 17:46 阅读 568

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

20

在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前面加上&则可得出正确结果,这个&到底有什么作用一定要加?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    qq_43066253 丶xiaoHai 2019-05-11 11:15

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

    点赞 评论 复制链接分享
  • heymye heymye 2019-05-10 19:34

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

    点赞 1 评论 复制链接分享
  • chinarealone chinarealone 2019-05-13 13:17

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

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

    点赞 评论 复制链接分享

相关推荐