[英]C++ - Static Assignment in Initialization
说我有一个C ++函数:
void foo(int x) {
static int bar = x;
}
如果我调用foo(3)
然后调用foo(4)
,我的理解是bar的值仍然是3.这是为什么? 我理解为什么初始化的内存分配部分是多余的。 但为什么这项任务也被忽略了?
这不是“任务”。 这是一个初始化 。 并且,根据C ++语言的规则,静态对象的初始化只执行一次 - 当控件第一次传递声明时 。
在您的示例中,当x
为3
时,控件将传递bar
的声明。 所以, bar
用3
初始化。 它永远不会被“重新初始化”,即调用foo(4)
根本不会影响bar
。 如果要在此之后更改bar
的值,则必须直接修改bar
。
简短回答:因为标准是这么说的。
答案很长:这不是一个任务 ,而是一个初始化 ,它被忽略了,因为标准是这样说的。
bar
的内存位置在第一次调用foo
之前无效,这是在实例化bar
时。 bar
在实例化时被初始化为x
。 之后每次调用foo
, bar
都已经实例化,因此已经初始化。
这是静态变量的初始化,而不是为其赋值。 话虽如此,如果你在第一个位置调用foo(3),bar的值总是为3。
考虑一些不同的静态变量:
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
}
您是否还认为每次调用函数时s1
应该“赋值”值为"baz"
? s2
怎么样? i
呢?
这些语句都不执行任何赋值,它们都是初始化,并且只执行一次。 仅仅因为包含=
字符的语句不能使其成为赋值。
为什么语言被定义为工作方式的一个原因是,它是共同使用本地静态变量运行一次的函数:
bool doInit()
{
// run some one-time-only initialization code
// ...
return true;
}
void func() {
static bool init = doInit();
// ...
}
如果每次调用函数时init
再次分配一个值,那么doInit()
将被多次调用,并且无法运行一次性设置。
如果你想在每次调用时更改值,那很简单......只需更改它即可。 但是,如果你不希望它不断变化那么就没有办法做到这一点,如果语言的运作方式则是问有关。
static const
局部变量也是不可能的:
void func() {
static const bool init = doInit();
// ...
}
糟糕,这会尝试在每次调用时更改init
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.