1、以值返回局部对象
class Person { public:Person(int age) {this->age = age;}// 以值方式返回局部对象会调用拷贝构造生成一个新的对象返回Person PersonAddPerson(Person p) {this->age += p.age;return *this;}int age; };void test01() {Person p1(10);cout << "p1.age = " << p1.age << endl;Person p2(10);p2.PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl; }
*this指对象本身,return一个对象且以值返回,会在return时用拷贝构造函数生成一个复制品,然后返回这个复制品,其返回的对象本身并不是对象本身。 p2.PersonAddPerson(p1).PersonAddPerson(p1);而这段代码在第一次执行PersonAddPerson(p1)时返回的是另一个对象,然后拿这另一个对象再执行PersonAddPerson(p1)时,其又返回另另一个对象。
2、以引用返回局部对象
Person& PersonAddPerson(Person p) {this->age += p.age;return *this;}
而以引用返回局部对象时,不会调用拷贝构造函数,其返回对象本身为对象本身。