C 参考和类对象的非参考返回 - 为什么输出相同

C++ reference and non reference return of class object- why output same?

本文关键字:参考 为什么 输出 返回 对象      更新时间:2023-10-16

考虑以下代码:

class Test  
{  
    public:  
    int data;
    Test() { data = 9; }
    Test myfunction ();
    void print() { cout << data<<endl; }
};  
Test m;
Test Test::myfunction ()
{
    return m;
};    

int main()
{   
    Test b;
    Test a;
    b=a.myfunction();
    b.print();
    return 0;
}

即使i 仅将函数替换为以下内容,输出也保持不变( i不会更改主节内的任何内容)。为什么这样?

class Test  
{  
    public:  
    int data;
    Test() { data = 9; }
    Test& myfunction ();
    void print() { cout << data<<endl; }
};  
Test m;
// function replaced and now it has reference return
Test& Test::myfunction ()
{
    return m; 
};   

int main()
{   
    Test b;
    Test a;
    b=a.myfunction();
    b.print();
    return 0;
}

两种情况之间的差异是什么??我在参考文献方面没有太多工作,所以请详细解释。

在每种情况下,两者都可以通过输出进行罚款,为:9

在第一个摘要中,您返回全局实例m的副本。在您的情况下,编译器会生成一个琐碎的复制构造函数,将复制您的成员data。另外,您将获得琐碎的琐事分配运算符生成的生成,将结果复制到b,也自动复制您的成员data

第二版返回对全局实例m的引用。从这一点开始,它的工作原理与第一种情况相同:将结果分配给b。仅仅是Test的一个副本操作。

您创建的所有对象都使用默认构造函数,该构造器分配data = 9。没有代码将data更改为其他任何代码。因此,除了9

,您什么都不会看到

在第一种情况下,当您按值返回时,将构造对象。由于您没有提供明确的复制构造函数,因此data被复制。

添加以查看不同的输出,

Test(const Test& lhs){ data = 22; } 

您期望看到什么输出?或参考的哪一部分令人困惑?