在以下示例中 -
#include <iostream>
int someMethod(){
static int a = 20;
static const int result = a + 1;
++a;
std::cout << " [" << a << "] ";
return result;
}
int main(){
std::cout << someMethod() << "\n";
std::cout << someMethod() << "\n";
std::cout << someMethod() << "\n";
}
输出为 -
[21] 21
[22] 21
[23] 21
在对同一函数进行的后续调用中,阻止result
值被修改的原因是什么?我也打印了变量a
的输出,这肯定会增加,因为它是静态的,所以同一方法不能存在多个副本。
答案 0 :(得分:4)
由于result
是静态的,因此它将在运行时期间仅初始化一次。因此,无论您调用someMethod()
static const int result = a + 1;
答案 1 :(得分:3)
这里的const
只会让读者误解真正的原因。此代码执行完全相同。
int someMethod(){
static int a = 20;
static int result = a + 1;
++a;
std::cout << " [" << a << "] ";
return result;
}
真正的原因是=
符号可以代表C ++中的两种不同操作:分配(每次执行)或初始化(仅在创建变量时执行)。它是变量的声明/定义的一部分的区别。
在正常上下文中(不是bloc静态变量),两者都是等价的,因为每次声明它运行的块时都会创建一个自动变量(或者至少编译器必须确保所有行为就像< / em>就是那个案例)。
但对于块静态变量,初始化只发生一次,这里变量result初始化为21,其值永远不会改变。
那些变体会有很大差异
int someMethod(){
static int a = 20;
static int result;
result = a + 1; // assignation: result will see its value change with the value of a
...
int someMethod(){
static int a = 20;
static const int result = a;
result = a + 1; // Error modification of a const declared variable
答案 2 :(得分:1)
静态提示编译器不要重新初始化变量,除了强制编译器在程序的数据段上分配变量的值。
答案 3 :(得分:0)
正如其他人所解释的那样,result
是一个static
变量,因此仅在第一次执行someMethod()
时初始化。
result
也是const
,因此第一个值用
static const int result = a + 1;
对于以下程序的执行,保持不变。
我认为你期待使用参考可以实现的东西;如果您按如下方式修改前一行
static const int & result = a;
^
// note the & ---|
您将result
关联到a
并修改a
修改result
,输出
[21] 21
[22] 22
[23] 23
问题是你可以将变量引用到另一个变量,而不是表达式;因此,您可以将result
与a
相关联,而不是a+1
(而不是动态值a+1
);所以以下一行
static const int & result = a + 1;
编译但是(如果我没错)将result
链接到未命名的变量,其中存储(在第一次执行someMethod()
时)表达式a + 1
的结果,所以输出再次
[21] 21
[22] 21
[23] 21