我有一个执行以下操作的函数:
- 当函数被调用并传递一个 true bool 值时,它将静态 bool 值设置为 true
- 当调用函数并传递一个字符串时,如果静态布尔值设置为 true,它将对该字符串执行一些操作
这是我关心的问题——两个重载函数之间的静态变量是否保持不变?如果没有,我可以简单地创建一个单独的函数来跟踪布尔值,但我尽量保持简单。
我有一个执行以下操作的函数:
这是我关心的问题——两个重载函数之间的静态变量是否保持不变?如果没有,我可以简单地创建一个单独的函数来跟踪布尔值,但我尽量保持简单。
两个重载函数是两个不同的函数。即使每个函数都包含static bool
具有相同标识符的 a,它们也属于不同的范围,并且标识符指的是每个函数中的不同变量。
如果您需要在两个函数之间共享状态,则最好创建一个类来封装此状态并使两个函数成为该类的成员函数。
不,它会创建两个单独的静态变量 - 每个函数一个。任何 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 个功能。
由于它已经被证明,我想解决问题的核心:static
.
static
引入了全局状态,全局状态是邪恶的。它会导致细微的错误,难以正确测试(因为测试会影响之后执行的测试),甚至不会考虑在那里使用多线程......
因此,我真的鼓励你static
完全避免。然后,您将有 2 个解决方案:
选择更容易实现的。