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