用函数表示c ++中的引用

Rag*_*san 6 c++ c++11

任何人都可以请详细说明此代码中的引用行为,为什么它在第一行而不是11行打印12.

下面是代码

http://ideone.com/l9qaBp

#include <cstdio>
using namespace std;

int &fun()
{
    static int x = 10;
    x++;
    return x;
}

int main()
{
    int *ptr=&fun();
    int *ptr1=&fun();
    printf("%p  %p \t %d  %d",(void*)ptr,(void*)ptr1,*ptr,*ptr1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码的输出是

134519132 134519132 12 12

请解释为什么12在第一次通话时打印而不是11我知道在第二次通话时它应该打印12

Joh*_*rry 2

您的错误似乎在于认为一旦可用就立即printf()打印。*ptr它不是; 直到 和都计算完毕printf()后才会被调用。由于 和都指向相同的内存位置(这是一个静态变量),并且该位置在第一次调用第二次调用后都会更新,因此该地址保存该值。ptrptr1ptrptr1fun()

  • 当然他们调用这个函数。这就是operator() 的作用。您在赋值的右侧使用了两个运算符:“&amp;”和“()”,并且根据运算符优先级规则,首先执行函数,然后执行结果返回值的地址(静态“x ') 正在执行,然后将其存储在赋值运算符的左侧。如果您确实想要函数本身的地址,则必须使用“&amp;fun”。请注意缺少“()”括号。 (2认同)