通过引用返回对象

时间:2016-06-16 13:25:00

标签: c++ class return-by-reference

#include<iostream>
using namespace std;
class my_class
{
    int m,n;
public:
    void show(void);
    my_class& test(my_class b)
    {
        static my_class c;
        c.m=m+b.m;
        c.n=n+b.n;
        return c;
    }
    my_class(int x,int y) //Parametrized constructor
    {
        m=x;n=y;
    }
    my_class(){} //Default consructor
};
void my_class::show(void)
{
    cout<<m<<" "<<n;
}
main()
{
    my_class a(2,3),b(3,4); //Object initialisation
    my_class d=a.test(b);
    d.show();
}

函数test返回对函数中定义的静态对象c的引用。我将输出作为5 7。我需要有关以下内容的帮助:

  • 我也可以通过返回my_class而不是my_class&来实现相同的输出。返回值如何与此处的引用返回进行比较?返回引用的数据成员是否在赋值语句中复制{ {1}}对象my_class d=a.test(b)?或者d只是返回引用的别名吗?
  • 如果我将赋值语句更改为d, 即使那时我得到相同的输出。这意味着两种方式 写上面的陈述是对的吗?

  • 你能解释一下这两种情况究竟发生了什么 作业陈述?

2 个答案:

答案 0 :(得分:0)

  

如何按值返回与此处的引用返回相比?返回引用的数据成员是否在赋值语句my_class d = a.test(b)中复制到对象d?

是的,使用引用的对象复制初始化d。 (虽然,这确实不是作业,也不是声明)。

  

...或者只是返回引用的别名?

不,d不是引用,也不是引用的别名。它是一个非参考变量。

  

如果我将赋值语句更改为my_class&amp; d = a.test(b),即使这样我得到相同的输出?这是否意味着写上述陈述的两种方式都是正确的?

取决于的定义。这两种选择都不是格式错误,但它们做了不同的事情。什么是正确取决于您打算做什么。

  

您能否解释一下这两种任务陈述究竟发生了什么?

  • 返回值时,会创建一个临时对象,该对象从返回表达式进行复制初始化。
  • 返回引用时,不会创建临时副本。
  • 从返回的临时文件中复制初始化时,会创建另一个临时文件,并且隐式复制构造函数的引用参数将绑定到它。
  • 从返回的引用复制初始化时,隐式复制构造函数的引用参数绑定到返回引用引用的对象。
  • 绑定对返回引用的引用时,它将绑定到引用的对象。

该标准允许省略一些上述副本。

答案 1 :(得分:0)

  

按值返回如何与此处的引用返回相比?

通过从test()返回引用,与按值返回相比,该对象的副本少一个;但是,这不会改变对象d的任何内容,无论如何都是由副本创建的。

  

返回引用的数据成员是否在赋值语句my_class d = a.test(b)中复制到对象d?

是的。 d此处不是引用,它是my_class类型的变量。但这不是赋值,这是一个初始化,相当于使用复制构造函数:my_class d(a.test(b));

  

如果我将赋值语句更改为my_class&amp; d = a.test(b),即便如此我得到相同的输出?这是否意味着编写上述陈述的两种方式都是正确的?你能否解释一下这两种任务陈述到底发生了什么?

你得到相同的输出,但这完全不同:如果你将d定义为引用并以这种方式初始化它(my_class d=a.test(b)),它将被初始化为静态变量{{1} }。这样,对c的任何更改也会更改dcc实际上都会引用相同的变量)。两种说法都是对的,但使用其中一种取决于您期望的行为。