未显示的私有成员变量与源文件中的全局变量

时间:2011-03-28 18:15:50

标签: c++ global-variables private-members

我正在查看我目前正在处理的公司中的一些代码,我在*.cpp文件中看到了一些(不是很多)静态全局变量的声明(例如,存储一个监听器列表) ).h/.cpp文件属于某个类。如果一个变量(静态或其他)只由类本身使用,我总是声明它是私有的。

这比声明变量私有更有优势吗?这是不好的做法吗?或者,在声明仅由类使用的静态变量时,这是正常的吗?

  

编辑:在我的问题中,我问过静态,但是如果它是.cpp文件中的非静态全局变量而不是它是该类的私有成员呢?这是不好的做法还是认为好吗?在这种情况下有什么好处吗?

6 个答案:

答案 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变量类型的声明)。