2013-02-23 230 views
1

我有以下静态变量

 main() 
     { 
      // first instance of D 
      base *d1 = new D(); 
      d1->f(); 
      .... 
      // 2nd instance of D 
      base *d2 = new D(); 
      d2->f(); 
     } 

我发现我第一次实例d和呼叫D1 - > f()将静态变量设置为false。但第二次我调用d2-> f()代码甚至没有命中“static bool indicator = false;”并且它保持为真(从d1-f()的第一遍),这正是我想要的行为,但我不明白为什么会发生这种情况。有人可以请解释发生了什么。在此先感谢

+0

通过设计,初始值设定项对函数中的静态变量只运行一次。如果你不想要这种行为,那么你只需将该变量声明为非静态的。重点是通过多次调用该函数来维护该值。 – Lou 2013-02-23 03:21:41

回答

8

在成员函数中声明的静态变量会在函数调用之间保持它们的值。在所有实例中将只有一个副本,并且来自不同实例的对indicator的所有访问将影响相同的indicator。这意味着indicator只会被初始化

这里看到更多的信息:Static variables in class methods

另外这个代码不切换indicator,如果它是假的总是设置为true(我敢肯定是你想要的行为)。

if(!indicator) 
    { 
     ... 
     indicator=true; 
     } 
4

这正是在功能块内声明的静态变量的行为。从C编程语言中引入该功能以来一直如此。

静态声明也可以应用于内部变量。与自动变量一样,内部静态变量对于特定函数是局部的,但与自动变量不同,它们保持存在,而不是每次激活该函数时进出。 (K & R,第61页)。

静态初始化器在第一次调用contains函数之前执行。作为静态变量,变量保留其在调用中的最后状态。

+1

根据http://stackoverflow.com/a/35251486/3758484,这个答案是不正确的,因为它是关于C语言,这是一个C++问题。 – johnbakers 2016-02-07 08:55:57

+0

@johnbakers你是对的,编译时常量要求已经取消了C++。谢谢! – dasblinkenlight 2016-02-07 10:19:27