栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间:发布时间: 百科书网 趣学号

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

#include 
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< 

输出为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 
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< 

输出为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 
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< 

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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/743397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号