重载函数中的静态变量

时间:2010-06-14 07:27:01

标签: c++ static function static-variables overloading

我有一个执行以下操作的功能:

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

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

3 个答案:

答案 0 :(得分:6)

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

如果你需要在两个函数之间共享状态,你可能最好使一个类封装这个状态并使这个类的两个函数成为成员函数。

答案 1 :(得分: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;   
}

答案 2 :(得分:0)

答案是否定的。没有理由应该这样,因为毕竟我们正在谈论两个功能。

由于已经证明了这一点,我想谈谈问题的核心:static

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

因此,我真的鼓励你完全避开static。那么你将有2个解决方案:

  • 使用两个重载作为方法创建一个类,并存储状态(不是静态的,请)
  • 将bool作为参数传递给方法,将bool重载的out参数和字符串重载的in-parameter传递给

选择更容易实现的目标。