static const cached结果

时间:2016-12-22 04:06:26

标签: c++ c++11 static const

在以下示例中 -

#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的输出,这肯定会增加,因为它是静态的,所以同一方法不能存在多个副本。

IDEONE - COMPILER OUTPUT

4 个答案:

答案 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

问题是你可以将变量引用到另一个变量,而不是表达式;因此,您可以将resulta相关联,而不是a+1(而不是动态值a+1);所以以下一行

static const int & result = a + 1;

编译但是(如果我没错)将result链接到未命名的变量,其中存储(在第一次执行someMethod()时)表达式a + 1的结果,所以输出再次

 [21] 21
 [22] 21
 [23] 21