类对象的C ++引用和非引用返回 - 为什么输出相同?

时间:2014-01-29 19:20:32

标签: c++

考虑以下代码:

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 仅用以下内容替换功能,输出也保持不变(我不会更改主要部分内的任何内容)。为什么会这样?

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

2 个答案:

答案 0 :(得分:2)

在第一个代码段中,您将返回全局实例m的副本。在您的情况下,编译器会生成一个普通的复制构造函数,它将复制您的成员data。此外,您还会生成一个琐碎的普通复制分配操作符,它会将结果复制到b,同时自动复制您的成员data

第二个版本返回对全局实例m的引用。从这一点来看,它与第一种情况相同:结果被分配给b。它只是Test的一个复制操作。

答案 1 :(得分:1)

您创建的所有对象都使用默认构造函数,该构造函数指定data = 9。没有代码可以将data更改为其他任何内容。所以除了9

之外你什么都看不见

在第一种情况下,按值返回时,对象是复制构造的。由于您未提供显式复制构造函数,因此data将按原样复制。

添加此项以查看不同的输出

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

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