C++ 通过引用返回对象 #包括 使用名称空间std; 上我的课 { int m,n; 公众: 无效显示(无效); 我的课程和测试(我的b级) { 静态我的_c类; c、 m=m+b.m; c、 n=n+b.n; 返回c; } my_类(intx,inty)//参数化构造函数 { m=x;n=y; } my_class(){}//默认构造函数 }; void my_类::show(void) { 库特
这里按值返回与按引用返回相比如何?返回引用的数据成员是否在赋值语句my_class d=a.test(b)中复制到对象d 是的,C++ 通过引用返回对象 #包括 使用名称空间std; 上我的课 { int m,n; 公众: 无效显示(无效); 我的课程和测试(我的b级) { 静态我的_c类; c、 m=m+b.m; c、 n=n+b.n; 返回c; } my_类(intx,inty)//参数化构造函数 { m=x;n=y; } my_class(){}//默认构造函数 }; void my_类::show(void) { 库特,c++,class,return-by-reference,C++,Class,Return By Reference,这里按值返回与按引用返回相比如何?返回引用的数据成员是否在赋值语句my_class d=a.test(b)中复制到对象d 是的,d是使用引用的对象进行复制初始化的。(尽管,这实际上不是赋值,也不是语句) …或者d只是返回引用的别名 不,d不是引用,也不是引用的别名。它是非引用变量 如果我将赋值语句更改为我的_class&d=a.test(b),即使这样,我也会得到相同的输出?这是否意味着编写上述语句的两种方法都是正确的 取决于权利的定义。两种选择都不是形式错误的,但它们做的事情不同。什么是正确的
d
是使用引用的对象进行复制初始化的。(尽管,这实际上不是赋值,也不是语句)
…或者d只是返回引用的别名
不,d
不是引用,也不是引用的别名。它是非引用变量
如果我将赋值语句更改为我的_class&d=a.test(b),即使这样,我也会得到相同的输出?这是否意味着编写上述语句的两种方法都是正确的
取决于权利的定义。两种选择都不是形式错误的,但它们做的事情不同。什么是正确的取决于你打算做什么
你能解释一下这两种赋值语句中到底发生了什么吗
- 当您返回一个值时,将创建一个临时对象,该对象是从返回表达式复制初始化的
- 返回引用时,不会创建临时副本
- 当您从返回的临时复制initialize时,将创建另一个临时,并且隐式复制构造函数的引用参数将绑定到它
- 从返回的引用复制initialize时,隐式复制构造函数的引用参数绑定到返回引用引用引用的对象
- 将引用绑定到返回的引用时,它将绑定到被引用的对象
d
是使用引用的对象进行复制初始化的。(尽管,这实际上不是赋值,也不是语句)
…或者d只是返回引用的别名
不,d
不是引用,也不是引用的别名。它是非引用变量
如果我将赋值语句更改为我的_class&d=a.test(b),即使这样,我也会得到相同的输出?这是否意味着编写上述语句的两种方法都是正确的
取决于权利的定义。两种选择都不是形式错误的,但它们做的事情不同。什么是正确的取决于你打算做什么
你能解释一下这两种赋值语句中到底发生了什么吗
- 当您返回一个值时,将创建一个临时对象,该对象是从返回表达式复制初始化的
- 返回引用时,不会创建临时副本
- 当您从返回的临时复制initialize时,将创建另一个临时,并且隐式复制构造函数的引用参数将绑定到它
- 从返回的引用复制initialize时,隐式复制构造函数的引用参数绑定到返回引用引用引用的对象
- 将引用绑定到返回的引用时,它将绑定到被引用的对象
test()
返回引用,与按值返回相比,对象的副本减少了一个;但是,这不会改变对象d
的任何内容,而对象d仍然是按副本创建的
返回引用的数据成员是否在赋值语句my_class d=a.test(b)中复制到对象d
是的。d
在这里不是引用,它是类型为my_class
的变量。但这不是赋值,这是初始化,相当于使用复制构造函数:my_class d(a.test(b));
如果我将赋值语句更改为我的_class&d=a.test(b),即使这样,我也会得到相同的输出?这是否意味着编写上述语句的两种方法都是正确的?您能解释一下这两种赋值语句中到底发生了什么吗
您会得到相同的输出,但这是完全不同的:如果您将d
定义为引用并以这种方式初始化它(my_class d=a.test(b)
),它将被初始化为静态变量c
。这样,对d
的任何更改也将更改c
(两个c
和d
实际上都引用相同的变量)。这两个语句都是正确的,但使用其中一个取决于您期望的行为
这里按值返回与按引用返回相比如何
通过从test()
返回引用,与按值返回相比,对象的副本减少了一个;但是,这不会改变对象d
的任何内容,而对象d仍然是按副本创建的
返回引用的数据成员是否在赋值语句my_class d=a.test(b)中复制到对象d
是的。d
在这里不是引用,它是类型为my_class
的变量。但这不是赋值,这是初始化,相当于使用复制构造函数:my_class d(a.test(b));
如果我将赋值语句更改为我的_class&d=a.test(b),即使这样,我也会得到相同的输出?这是否意味着上述语句的两种编写方法都是正确的?请您解释一下这两种方法到底发生了什么
#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();
}