C++难点七:链式编程中的引用返回问题-举例说明

本文通过三个示例详细分析了C++类成员函数返回类型(值返回与引用返回)如何影响对象的状态。在示例中,由于值返回会触发拷贝构造函数,导致对象状态在连续调用成员函数后发生变化,而引用返回则保持原始对象的更新状态。最终,这些示例展示了在编程中选择正确返回类型的重要性。
摘要由CSDN通过智能技术生成

在写代码的时候,发现了一个小问题:
例一:

#include <iostream>
using namespace std;

class Person
{
public:
    int age;
    Person(int age)
    {
        this->age=age;
    }
    Person addAge(Person &p)
    {
        this->age+=p.age;
        return *this;
    }
};

void test02()
{
    Person p1(10);
    Person p2(10);

    cout<<p2.addAge(p1).addAge(p1).addAge(p1).age;
}
int main() 
{
	test02();
	return 0;}

输出为40.
原因:类内函数addAge()是以值返回的,在难点五中已经说明,这种时机下拷贝构造函数会被调用,所以被返回的其实是另一个与p2现在值一样的变量,main函数中第一次p2.addAge(p1)返回一个p2’,p2’的age=20,再addAge(p1)一次返回一个p2’’,p2’‘的age=30,再来一次则返回p2’’’,p2’’‘的age=40。我们输出的相当于是p2’’’.age,所以正巧是40.
例二:

#include <iostream>
using namespace std;

class Person
{
public:
    int age;
    Person(int age)
    {
        this->age=age;
    }
    Person addAge(Person &p)
    {
        this->age+=p.age;
        return *this;
    }
};

void test02()
{
    Person p1(10);
    Person p2(10);
    p2.addAge(p1).addAge(p1).addAge(p1);
    cout<<p2.age;
}
int main() 
{
	test02();
	return 0;}

输出为20.
原因:同上,类内函数addAge()是以值返回的,在难点五中已经说明,这种时机下拷贝构造函数会被调用,所以被返回的其实是另一个与p2现在值一样的变量,main函数中第一次p2.addAge(p1)返回一个p2’,p2’的age=20,再addAge(p1)一次返回一个p2’’,p2’‘的age=30,再来一次则返回p2’’’,p2’’‘的age=40。
但是与上面不一样的是,我们输出的是p2.age而非p2’’’.age,所以只能输出20.

例三:

#include <iostream>
using namespace std;

class Person
{
public:
    int age;
    Person(int age)
    {
        this->age=age;
    }
    Person& addAge(Person &p)
    {
        this->age+=p.age;
        return *this;
    }
};

void test02()
{
    Person p1(10);
    Person p2(10);
    p2.addAge(p1).addAge(p1).addAge(p1);
    cout<<p2.age;
}
int main() 
{
	test02();
	return 0;}

输出为40.
原因:类内函数addAge()是以引用返回的,这种时机下不会调用拷贝构造函数,而是返回p2本身。main函数中第一次p2.addAge(p1)返回一个p2,p2的age=20,再addAge(p1)一次还是返回p2,p2的age=30,再来一次依旧返回p2,p2的age=40,最终main函数中输出p2的age。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值