当我们通过引用将方法用作参数时,到底发生了什么?
What's really happening when we use a method as a parameter by reference?
假设这样:
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
的内存地址本身,还是a.someMethod()
返回的m_someDataMemeber
副本的内存地址?
编辑:更正拼写错误,int& someMethod()
中缺少 &
这将是一个编译器错误,因为您试图将非 const
引用绑定到临时对象。
看到这个live example
您可以通过 someMethod()
return 一个您可能不想做的参考或者您可以使用 const
个参考来解决这个问题。
看到这个 live example 使用 const
参考
根据 OP 更改进行编辑:
如果您有一个 return 引用的函数,并且您在另一个函数的参数列表中调用该函数,那么该函数将引用第一个函数 return 编辑的任何变量。在这种情况下将不会进行复制。
what is exactly being received in anotherMethod()?
引用 相同变量 已收到。
Is it the memory address itself of m_someDataMember from object a
or the memory address of a copy of m_someDataMemeber returned by a.someMethod()?
该引用 可能是 内存地址,但 C++ 并未规定 编译器必须如何 实现引用。整个 class 也可以存在于 CPU 寄存器中,在这种情况下它没有内存地址。
但是m_someDataMember
的副本不是。它指的是同一个变量。
假设这样:
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
的内存地址本身,还是a.someMethod()
返回的m_someDataMemeber
副本的内存地址?
编辑:更正拼写错误,int& someMethod()
&
这将是一个编译器错误,因为您试图将非 const
引用绑定到临时对象。
看到这个live example
您可以通过 someMethod()
return 一个您可能不想做的参考或者您可以使用 const
个参考来解决这个问题。
看到这个 live example 使用 const
参考
根据 OP 更改进行编辑:
如果您有一个 return 引用的函数,并且您在另一个函数的参数列表中调用该函数,那么该函数将引用第一个函数 return 编辑的任何变量。在这种情况下将不会进行复制。
what is exactly being received in anotherMethod()?
引用 相同变量 已收到。
Is it the memory address itself of m_someDataMember from object a or the memory address of a copy of m_someDataMemeber returned by a.someMethod()?
该引用 可能是 内存地址,但 C++ 并未规定 编译器必须如何 实现引用。整个 class 也可以存在于 CPU 寄存器中,在这种情况下它没有内存地址。
但是m_someDataMember
的副本不是。它指的是同一个变量。