不,这不是每个人都能通过当地人的错误。我只是想了解返回对你传入的对象的引用(我正在阅读引文)。
所以,如果我有这样的功能:
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对象而不是对一个对象的引用。
答案 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);
做两件事。
object1
function2()
)
object2
的初始化会创建function2()