直接上代码:
class Person
{
public:
Person(int age)
{
//1、当形参和成员变量同名时,可用this指针来区分
this->age = age;
}
Person PersonAddPerson(Person p)
{
this->age += p.age;
//返回对象本身
return *this;
}
int age;
};
我们运行:
Person p(10);
Person p2(15);
p2.PersonAddPerson(p).PersonAddPerson(p);
cout << p2.age;
答案是25.
一起看一看函数执行过程:
首先,p2调用了PersonAddPerson(p)这个函数,
在调用过程中,p2自己让自己的年龄加上了p的年龄,变成了25;
因为我们还需要在用一次.符号来调用这个函数,
所以返回值必须是一个Person类型。
那么此时,p2.PersonAddPerson(p),就作为了一个左值Person,我们称它为P3,他和P2有着完全一样的年龄,但是他是P2的一份拷贝。
再进行函数调用时,就是P3来调用了。
也就是说,调用两次后,那个虚拟的P3的值变成了35,然后又复制了一份变成35后的P3,出现了一个P4。
所以此时P2的值还是25.
要解决这个问题,我们需要将返回值变成引用类型:
Person& PersonAddPerson(Person p)
{
this->age += p.age;
//返回对象本身
return *this;
}
这样每一次返回的就是P2了。