1

我有一个执行以下操作的函数:

  • 当函数被调用并传递一个 true bool 值时,它将静态 bool 值设置为 true
  • 当调用函数并传递一个字符串时,如果静态布尔值设置为 true,它将对该字符串执行一些操作

这是我关心的问题——两个重载函数之间的静态变量是否保持不变?如果没有,我可以简单地创建一个单独的函数来跟踪布尔值,但我尽量保持简单。

4

3 回答 3

6

两个重载函数是两个不同的函数。即使每个函数都包含static bool具有相同标识符的 a,它们也属于不同的范围,并且标识符指的是每个函数中的不同变量。

如果您需要在两个函数之间共享状态,则最好创建一个类来封装此状态并使两个函数成为该类的成员函数。

于 2010-06-14T07:31:27.330 回答
3

不,它会创建两个单独的静态变量 - 每个函数一个。任何 C++ 函数的名称都是由其表面名称和参数类型构成的,而静态函数的名称(至少在概念上)是附加在上面的。除了添加另一个函数之外,您还可以考虑将变量相对于包含函数的类设为静态,尽管这不会为您提供完全相同的行为,或者将其放置在匿名命名空间中:

namespace {
   int myvar = 0;
}

int f( bool b ) {
   return myvar;
}

int f( const string &  s  ) {
   return myvar;
}

使函数成为类的成员:

// a.h
class A {
   public:
    static int f( bool b ) {
       return myvar;
    }

    static int f( const string &  s  ) {
       return myvar;
    }
  private:
     static int myvar;
};

// a.cpp
int A::myvar = 0;   

// main.cpp

#include <iostream>
#include <a.h>
int main() {
    std::cout << A::f(false) << A::f( string("foobar") ) << std::endl;   
}
于 2010-06-14T07:31:44.253 回答
0

答案是不。没有理由这样做,因为毕竟我们在谈论 2 个功能。

由于它已经被证明,我想解决问题的核心:static.

static引入了全局状态,全局状态是邪恶的。它会导致细微的错误,难以正确测试(因为测试会影响之后执行的测试),甚至不会考虑在那里使用多线程......

因此,我真的鼓励你static完全避免。然后,您将有 2 个解决方案:

  • 使用两个重载作为方法创建一个类,并存储状态(请不要静态)
  • 将布尔值作为参数传递给方法,布尔重载的输出参数和字符串重载的输入参数

选择更容易实现的。

于 2010-06-14T09:24:14.480 回答