C 参考和类对象的非参考返回 - 为什么输出相同
C++ reference and non reference return of class object- why output same?
考虑以下代码:
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 仅将函数替换为以下内容,输出也保持不变( 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
在第一个摘要中,您返回全局实例m
的副本。在您的情况下,编译器会生成一个琐碎的复制构造函数,将复制您的成员data
。另外,您将获得琐碎的琐事分配运算符生成的生成,将结果复制到b
,也自动复制您的成员data
。
第二版返回对全局实例m
的引用。从这一点开始,它的工作原理与第一种情况相同:将结果分配给b
。仅仅是Test
的一个副本操作。
您创建的所有对象都使用默认构造函数,该构造器分配data = 9。没有代码将data
更改为其他任何代码。因此,除了9
在第一种情况下,当您按值返回时,将构造对象。由于您没有提供明确的复制构造函数,因此data
被复制。
添加以查看不同的输出,
Test(const Test& lhs){ data = 22; }
您期望看到什么输出?或参考的哪一部分令人困惑?
相关文章:
- 为什么在运算符重载时需要参考?
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 为什么make_nvp需要非常量参考?
- 为什么参考简历的格式不正确?
- 当课程成员成员时,为什么参考会占据内存
- 为什么即使传递给函数作为参考,指针也未被分配
- 为什么通用参考概念不适用于函数指针的地图插入
- 为什么编译器不给出模棱两可的参考错误
- 为什么共享_ptr需要保留foref_ptr的参考计数
- 为什么const rvalue合格的std ::可选:: value()返回const rvalue参考
- 为什么双转换到看似任何原始的常量参考
- 为什么要拿参考的地址给我一个第二等级的指针
- 为什么要使用参考而不是原始参考?
- C 11:为什么RVALUE参考参数隐式转换为LVALUE
- 为什么参考变量在声明时需要初始化
- 为什么动态演员只能与参考和指针一起使用
- 为什么未调用具有常量参考返回值的超载方法
- 为什么该函数不会获得动态数组?(我正在使用指针和参考)
- 为什么``polymorphic_allocator`取一个emore _ resource`指针''而不是参考
- C++通用参考.为什么右值引用变为右值?