关于返回对象的引用

时间:2010-07-13 00:34:57

标签: c++

不,这不是每个人都能通过当地人的错误。我只是想了解返回对你传入的对象的引用(我正在阅读引文)。

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

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;

当我通过引用返回时,object2不应该与object1具有相同的地址(和属性)吗?不应该改变一个对象中的“someproperty”来改变另一个对象的值吗?或者,返回对对象的引用是否只是将值复制到新对象中?

似乎同样的事情正在发生,好像我只是说我要返回一个foo对象而不是对一个对象的引用。

3 个答案:

答案 0 :(得分:6)

foo object2 = object1.function2(object1);

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

如果您将object2声明为const引用:

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

然后object2将引用object1

答案 1 :(得分: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

答案 2 :(得分:0)

代码行:

foo object2 = object1.function2(object1);

做两件事。

  1. object1
  2. 返回引用(恰好引用function2()
  3. object2的初始化会创建function2()
  4. 返回的对象的副本