#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
,
即使那时我得到相同的输出。这意味着两种方式
写上面的陈述是对的吗?
你能解释一下这两种情况究竟发生了什么 作业陈述?
答案 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
的任何更改也会更改d
(c
和c
实际上都会引用相同的变量)。两种说法都是对的,但使用其中一种取决于您期望的行为。