函数范围内的静态声明和定义不会改变?

时间:2016-12-06 09:59:25

标签: c++ static macros

好的,在将构造函数/函数中声明的静态变量(我认为不重要)分配给编译时定义的值时,就好像变量只分配了一次,参见示例:

#include <iostream>
#define y  4
#define z  3
using namespace std;

class Foo
{
public:
    Foo(int x)
    {
        static int i = x;
        cout << i << endl;
    }
};

int main() 
{
    Foo p(y);
    Foo o(z);
    return 0;
}

预期产出:

4

3

实际输出:

4

4

我找不到任何关于搜索的内容,但如果这是一个骗局,请告诉我,我会关闭这个问题。

1 个答案:

答案 0 :(得分:2)

static局部变量第一次输入它所驻留的函数时,它只被初始化一次。因此,只有第一次初始化发生,并且忽略所有其他初始化。

这是您的程序,经过修改以说明它。

#include <iostream>
#define y  4
#define z  3
using namespace std;

struct Bar {
    int i;
    Bar(int i) : i{i}
    {
        cout << "Bar::Bar with " << i << '\n';
    } 
};

class Foo
{
public:
    Foo(int x)
    {
        static Bar b = x;
        cout << b.i << '\n';
    }
};

int main() 
{
    Foo p(y);
    Foo o(z);
    return 0;
}

如果您希望每次后续调用都修改i,则需要指定

static int i; // default initialize i.
i = x; // assign a new value into i