说我有一个C++函数:
void foo(int x) {
static int bar = x;
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话foo(3)然后打电话foo(4),我的理解是吧的价值仍然是3.这是为什么?我理解为什么初始化的内存分配部分是多余的.但为什么这项任务也被忽略了?
这不是"任务".这是一个初始化.并且,根据C++语言的规则,静态对象的初始化只执行一次 - 当控件第一次传递声明时.
在您的例子,控制越过申报bar时x为3.所以,用bar初始化3.它永远不会被"重新初始化",即呼叫foo(4)根本不会影响bar.如果要更改之后的值bar,则必须bar直接修改.
考虑一些不同的静态变量:
void foo(int x) {
static int bar = x;
static std::string s1 = "baz";
static std::string s2("baz");
static int i{2}; // C++11-style uniform initialization
}
Run Code Online (Sandbox Code Playgroud)
您是否还认为每次调用函数时都s1应该“分配”该值?"baz"关于什么s2?关于什么i?
这些语句都不执行任何赋值,它们都是初始化,并且只完成一次。仅仅因为语句包含该=角色并不意味着它是一个赋值。
该语言被定义为以这种方式工作的原因是,通常使用局部静态变量来运行一次函数:
bool doInit()
{
// run some one-time-only initialization code
// ...
return true;
}
void func() {
static bool init = doInit();
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果init每次调用该函数时都再次分配一个值,那么doInit()将被多次调用,并且将无法达到运行一次性设置的目的。
如果您想在每次调用时更改该值,那很简单......只需更改它即可。但是,如果您不希望它不断变化,那么如果语言按照您询问的方式工作,就没有办法做到这一点。
也不可能有static const局部变量:
void func() {
static const bool init = doInit();
// ...
}
Run Code Online (Sandbox Code Playgroud)
init哎呀,这会尝试在每次调用时更改它的值。