2

我想创建一个具有静态方法的类,该方法返回对静态变量的引用(在方法内部声明)。我想要的是在调用该方法以获取静态变量的引用时。然后当我在类外修改它并再次调用该方法以获得我之前设置的相同值时。

这是我尝试过的:

#include <iostream>
using namespace std;

class A
{
public:
    static int& f()
    {
        static int i;
        return i;
    }
};

int main()
{
    static int i;
    i = A::f();

    cout << i << endl;

    i = 11;
    cout << i << endl;

    i = A::f();
    cout << i << endl;

    return 0;
}

问题是这段代码的输出是:

0
11
0
Press <RETURN> to close this window...

为什么它不返回0, 11, 11,我怎样才能让它返回0, 11, 11

注意:我希望静态变量在方法内部显式声明,而不是作为成员。

谢谢!

4

4 回答 4

6

这是因为您将引用返回的值复制到常规变量中:当您存储int&在 an中时int,它不再是引用。

你应该做的是

int &i = A::f();

注意,本地i不需要static:引用静态数据可以存储在自动变量中没有问题。

于 2013-01-25T14:25:41.360 回答
4

要让局部变量i引用函数内的同一个变量,请将其声明为引用:

static int& i = A::f();

否则,您只是创建一个新变量并使用分配A::f()给它。

于 2013-01-25T14:25:19.353 回答
4

它必须是int&in main,如果您希望对它的更改int是对返回值所引用的 int 的更改f

于 2013-01-25T14:25:52.140 回答
2

您可能想要初始化您的变量。您可以直接使用它,或者您可能希望在本地参考中“保存”参考。但是您不能重新分配这些本地引用。例如:

int main()
{
    A::f()=3;
    cout << A::f() << endl;

    static int &i = A::f();
    cout << i << endl;

    i = 11;
    cout << i << endl;

    cout << A::f() << endl;

    int &ii = A::f();
    cout << ii << endl;

    return 0;
}
于 2013-01-25T14:31:57.610 回答