我正在查看我目前正在处理的公司中的一些代码,我在*.cpp
文件中看到了一些(不是很多)静态全局变量的声明(例如,存储一个监听器列表) ).h/.cpp
文件属于某个类。如果一个变量(静态或其他)只由类本身使用,我总是声明它是私有的。
这比声明变量私有更有优势吗?这是不好的做法吗?或者,在声明仅由类使用的静态变量时,这是正常的吗?
编辑:在我的问题中,我问过静态,但是如果它是
.cpp
文件中的非静态全局变量而不是它是该类的私有成员呢?这是不好的做法还是认为好吗?在这种情况下有什么好处吗?
答案 0 :(得分:5)
这种方式的主要优点是减少了* .h文件中“不必要”的内容。这可能会略微改善文件或修改时的编译时间和/或重建复杂性,并且可能使头文件更容易阅读。
(在我看来,这些优点很小,而且我通常更喜欢将逻辑上与某个类相关的东西放在该类的范围内。)
但是,不推荐使用静态全局变量,而在C ++中则不合适。如果没有其他适当的范围,则应使用匿名命名空间。
// Instead of this:
static std::list<MyClass*> MyClass_population;
// Do this:
namespace { // anonymous
std::list<MyClass*> MyClass_population;
}
答案 1 :(得分:4)
从风格的角度来看,这可能会,也可能不会,但风格是主观的。
从技术角度来看,存在一些差异:
+----------------+-------------+
| Private Static | File Static |
+----------------------------+----------------+-------------+
| Visible by includers | Yes | No |
+----------------------------+----------------+-------------+
| Accessible to friend | Yes | No |
+----------------------------+----------------+-------------+
| Accessible to all in TU* | No | Yes |
+----------------------------+----------------+-------------+
| Require #include in header | Yes | No |
+----------------------------+----------------+-------------+
*TU: Translation Unit (roughly put: the source file after include resolution)
因此,从技术上讲,文件范围内的static
变量(或匿名命名空间中的变量)可以更多私有,除了它跟随它的所有代码都可以看到源文件(稍微改变了可访问性)。
我个人更喜欢这些目标的原因。我倾向于将我的标题尽可能地保留为空,因为它使更改对客户端没有任何影响更容易(并且我大多数时候都是客户端!)
注意:如果我忘记了差异,请告诉/编辑
答案 2 :(得分:0)
静态仅表示您希望变量在该文件中可用,对于私有,它仅表示该类。在某些情况下,它们大致相同,但我倾向于先选择静态,因为它是一个编译时变量而不是运行时自动变量。虽然这取决于编译器优化。
答案 3 :(得分:0)
我通常在有一个函数或变量时,我希望在驻留在同一文件中的类之间共享。在Java中,我认为这可以(我在这里猜测)通过内部类实现。我认为只要头文件的外部用户可见界面不依赖于它们,它就是无害的。
答案 4 :(得分:0)
没有static
全局变量这样的东西:你所看到的是具有文件范围的static
变量。 (至少,我的C ++老师没有把这些称为全局;我不确定标准称这些是什么。)
然而,它们具有全局变量的所有优点以及全局变量的所有缺点,除了一个:如果它们具有相同的名称,它们不会相互冲突。
例如,以下内容不会链接:
// in a.cpp
static int a;
int b;
// in a.cpp
static int a;
int b;
因为全局符号b
出现两次。但是,a
没有问题。
与static
类变量的区别在于它们出现在标题中,因此更改,删除或添加它们需要重新编译所有客户端代码。
答案 5 :(得分:0)
与您一样,我通常更喜欢在class static
文件中使用.h
而不是static
文件中的全局.cpp
。
但是,当我更喜欢全球static
时,会有一个场合。这是因为它无需在#include
文件中使用static
指令(以访问.h
变量类型的声明)。