当我们通过引用使用方法作为参数时,真正发生了什么?

时间:2015-07-15 15:45:41

标签: c++ memory pass-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的内存地址本身,还是m_someDataMemeber返回的a.someMethod()副本的内存地址?

编辑:修正了错误,错过了&

中的int& someMethod()

2 个答案:

答案 0 :(得分:2)

  

在anotherMethod()中究竟收到了什么?

收到相同变量参考

  

它是来自对象a的m_someDataMember的内存地址本身    或a.someMethod()返回的m_someDataMemeber副本的内存地址?

该引用可能是一个内存地址,但C ++并没有规定编译器必须如何实现引用。整个类也可以存在于CPU寄存器中,在这种情况下它没有内存地址。

m_someDataMember的副本。它指的是同一个变量。

答案 1 :(得分:1)

当您尝试将非const引用绑定到临时对象时,这将是一个编译器错误。

请参阅此live example

您可以通过让someMethod()返回您可能不想做的引用或者可以const引用来解决此问题。

使用const参考

查看此live example

根据OP更改进行修改

如果你有一个返回引用的函数,并且你在另一个函数的参数列表中调用该函数,那么该函数将引用第一个函数返回的任何变量。在这种情况下不会复制。