当我们通过引用将方法用作参数时,到底发生了什么?

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的副本不是。它指的是同一个变量。