假设:
class A
{
public:
A(int x) : m_someDataMember(x) {}
~A() {}
int& someMethod(){ return m_someDataMember; }
private:
int m_someDataMember;
};
class B
{
public:
B(){}
~B(){}
void anotherMethod(int& someInt){ /*...*/}
};
现在是主要的,
int main(/*..*/)
{
A a(5);
B b;
b.anotherMethod(a.someMethod());
}
我的问题是,anotherMethod()
到底收到了什么?它是来自对象a的m_someDataMember
的内存地址本身,还是m_someDataMemeber
返回的a.someMethod()
副本的内存地址?
编辑:修正了错误,错过了&
int& someMethod()
答案 0 :(得分:2)
在anotherMethod()中究竟收到了什么?
收到相同变量的参考。
它是来自对象a的m_someDataMember的内存地址本身 或a.someMethod()返回的m_someDataMemeber副本的内存地址?
该引用可能是一个内存地址,但C ++并没有规定编译器必须如何实现引用。整个类也可以存在于CPU寄存器中,在这种情况下它没有内存地址。
但m_someDataMember
的副本不。它指的是同一个变量。
答案 1 :(得分:1)
当您尝试将非const
引用绑定到临时对象时,这将是一个编译器错误。
请参阅此live example
您可以通过让someMethod()
返回您可能不想做的引用或者可以const
引用来解决此问题。
使用const
参考
根据OP更改进行修改:
如果你有一个返回引用的函数,并且你在另一个函数的参数列表中调用该函数,那么该函数将引用第一个函数返回的任何变量。在这种情况下不会复制。