2010-07-13 56 views
0

不,这不是每个人传递给当地人的错误。我只是试图理解返回一个对你传入的对象的引用(我正在阅读引用)。关于返回对象的引用

所以,如果我有这样的功能:

const foo & foo::function2(const foo & val) const 
{ 
    using namespace std; 
    return *this; 
} 

,然后我在主这样做:

foo object1; 
object1.someproperty = 7; 

foo object2 = object1.function2(object1); 
object2.someproperty = 5; 

cout << &object1 << endl; 
cout << &object2 << endl; 

当我返回由参考,不应该对象2具有相同地址(和属性)为object1?不应该改变一个对象中的“某些属性”来改变另一个对象中的值吗?或者,返回对象的引用是否简单地将值复制到新对象中?

似乎同样的事情正在发生,就像我刚才说的那样,我将返回一个foo对象而不是一个引用。

+0

不,因为你声明了两个不同的对象在堆栈上并复制它们的值。 – cpx 2010-07-13 00:44:13

回答

6
foo object2 = object1.function2(object1); 

function2()返回对object1的引用;然后调用foo拷贝构造函数将object1拷贝到object2中,因为object2被声明为foo对象。

如果声明object2为const引用来代替:

const foo& object2 = object1.function2(object1); 

然后object2object1参考。

+0

好吧,有意义的是,一些事情隐藏在引擎盖下。感谢大家的快速和彻底的反应。 – Ilya 2010-07-13 00:51:31

0

的代码行:

foo object2 = object1.function2(object1); 

做两件事情。

  1. 的引用(这恰好是指object1)从function2()
  2. 返回的object2初始化会创建function2()
1

返回的对象的副本,你碰到了自动拷贝构造函数,当你分配给object2。有效事情的经过是:

foo object2(object1.function2(object1)); 

凡自动生成的拷贝构造函数是这样的:

class foo { 
public: 
    foo(const foo& other) { 
    //shallow copy other to this 
    } 
} 

为了让代码做你认为它应该做的,你需要申报对象2作为const引用:

const foo& object2 = object1.function2(object1); 
//&object2 == &object1