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

标签 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

我在搜索时找不到任何东西,但如果这是一个骗局,请告诉我,我会关闭这个问题。

最佳答案

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

关于c++ - 函数范围内的静态声明和定义不会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992501/

相关文章:

c++ - cpp使用 vector 编译错误初始化二维数组

C++ 成员函数的无效使用(你忘记了 '()' 了吗?)

java - 为什么这个静态嵌套类不能在一台计算机上的 Java 中运行?

c++ - 在其声明文件之外使用对象 (C++)

任何人都可以解释输出

C宏gsl库代码转换为D

c++ - 空迭代器会导致未定义的行为吗?

C++ - 使用临时变量索引数组

c++ - 如何从静态方法中获取类名?

functional-programming - 或作为方案中的程序