Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 方法中的静态局部变量是一种糟糕的做法?_C++_Variables_Static - Fatal编程技术网

C++ 方法中的静态局部变量是一种糟糕的做法?

C++ 方法中的静态局部变量是一种糟糕的做法?,c++,variables,static,C++,Variables,Static,有件事困扰着我 在非线程程序中,使用局部静态变量(方法内部)或静态类成员更好吗 在本例中: class C{ public: C(){}; void foo(); }; void C::foo(){ static int bar = 0; bar++; printf("%d\n",bar); } 如果bar仅用于C::foo(),这被认为是一种不好的做法吗?面向对象说,bar是类C的状态的一部分。这就是为什么我通常喜欢使用字段而不是静态局部变量的原因。两者都不是更好的。

有件事困扰着我

在非线程程序中,使用局部静态变量(方法内部)或静态类成员更好吗

在本例中:

class C{
public: 
  C(){};
  void foo();
};

void C::foo(){
  static int bar = 0;
  bar++;
  printf("%d\n",bar);
}

如果
bar
仅用于
C::foo()
,这被认为是一种不好的做法吗?

面向对象说,bar是类C的状态的一部分。这就是为什么我通常喜欢使用字段而不是静态局部变量的原因。

两者都不是更好的。它们提供非常不同的用例

如果是公共类,静态类成员需要编辑头文件。这并不总是可取的


另一个选项是匿名命名空间中的文件范围变量。如果只需要在一个方法中访问,并且需要在多个方法中访问,这就足够了。

局部和非局部全局变量都是“坏”的,因为它们是全局变量。但这两种情况下的初始化和访问是不同的,因此使用哪种情况的答案取决于您对这些需求的需求


另外,根据编译器的不同,使用静态存储持续时间动态初始化局部变量可能不是线程安全的。好消息是,在C++0x中,它保证是线程安全的。

我通常会尽量限制变量的范围,只要它不会变得怪异或乏味

如果您在
类别C
中有1000行代码,其中在
foo
函数中有100行代码,则您对
所做的任何更改(例如,更改名称或类型)都需要超过100行代码,以确保更改正常。如果您有
bar
一个静态类成员,您可能需要检查1000行代码,以确保那里没有使用
bar
。这是浪费时间


如果您认为在另一个函数<代码> fO2(例如,在计数计数为>代码> Foo和<代码> FoO2一起时),您可能希望使<代码> bar >代码>静态类成员。

< P>我将考虑使用<代码>静态< /代码>成员,但不使用<代码> const 值。(不符合
constexpr
)是一种不好的做法。静态成员或方法本地的范围是全局的,它恰好只能由类的(所有实例)访问

非const类static是我列出的最糟糕的做法。它比简单地声明一个全局变量更糟糕,因为它是隐藏的。一个单例类(甚至只是一个只构造一次并传递给依赖类的类)可以消除这种做法

否则,我建议通过一个全局访问器公开静态代码(周围有大而难看的注释)

//危险,全局状态。
国际公司
{
静态整型条=0;
返回条++;
}
上我的课
{
公众:
我的班级()
{
}
void公司()
{
printf(“%d\n”,inc_bar());
}
};

你答案的开头听起来很有希望,但你能详细说明一下吗?@IIyan,他的代码中的语义是“打印出‘foo’被调用了多少次!”从他的问题中可以看出,这与类的状态无关,因此将变量作为静态类成员显然是错误的。然而,如果
foo
将是一个复制构造函数,
bar
将被称为
numberOfCopies
,那么它将是静态类成员的一个很好的候选对象。因此取决于如何使用。哪个对象的状态?全局变量(本例中为静态变量)不是任何对象状态的一部分,而是全局状态的一部分。不,不是。只有非静态成员可以用作“状态”对象的状态。-1您不知道
bar
是类状态的一部分。它可能是成员函数状态的一部分。在这种情况下,局部静态是合适的。全局变量没有错。问题是全局可访问的可变状态。这两种状态都不正确。@MartinYork,此状态是全局、可变和acce可能。C的任何实例都可能改变它。@evoskuil我对这个答案发表了评论。声明:
局部和非局部全局变量都是“坏的”
。就其本身而言,这个声明是错误的。问题(与问题一样)是全局可变状态。@evoskuil:那个问题和答案已经有十多年历史了。为什么要阅读问题的零点答案呢?+1最小化“静态”变量范围很重要。全局vs..cpp模块vs.类vs.方法/函数vs.嵌套{}我倾向于使用.cpp模块级静态数据,而不是将其包含在类声明中,因为如果将其粘贴在类头中,则客户端现在依赖于实现细节。