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++ 通过引用返回对象 #包括 使用名称空间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),即使这样,我也会得到相同的输出?这是否意味着编写上述语句的两种方法都是正确的 取决于权利的定义。两种选择都不是形式错误的,但它们做的事情不同。什么是正确的

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

是的,
d
是使用引用的对象进行复制初始化的。(尽管,这实际上不是赋值,也不是语句)

…或者d只是返回引用的别名

不,
d
不是引用,也不是引用的别名。它是非引用变量

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

取决于权利的定义。两种选择都不是形式错误的,但它们做的事情不同。什么是正确的取决于你打算做什么

你能解释一下这两种赋值语句中到底发生了什么吗

  • 当您返回一个值时,将创建一个临时对象,该对象是从返回表达式复制初始化的
  • 返回引用时,不会创建临时副本
  • 当您从返回的临时复制initialize时,将创建另一个临时,并且隐式复制构造函数的引用参数将绑定到它
  • 从返回的引用复制initialize时,隐式复制构造函数的引用参数绑定到返回引用引用引用的对象
  • 将引用绑定到返回的引用时,它将绑定到被引用的对象
该标准允许省略部分提及的副本

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

是的,
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();
}