繁体   English   中英

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

[英]Unexposed private member variables vs. global variables in the source file

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

在声明变量私有方面是否有优势? 这是不好的做法吗? 或者在声明仅由类使用的静态变量而没有其他人时这是正常的吗?

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

这种方式的主要优点是减少了* .h文件中“不必要”的内容。 这可能会略微改善编译时间和/或重建文件或修改时的复杂性,并且可能使头文件更容易阅读。

(在我看来,这些优点很小,而且我通常更喜欢将逻辑上与某个类相关的东西放在该类的范围内。)

但是,静态全局变量在C ++中已被弃用并且是不好的做法。 如果没有其他适当的范围,则应使用匿名命名空间。

// Instead of this:
static std::list<MyClass*> MyClass_population;

// Do this:
namespace { // anonymous
    std::list<MyClass*> MyClass_population;
}

从风格的角度来看,这可能会,也可能不会,但风格是主观的。

从技术角度来看,存在一些差异:

                             +----------------+-------------+
                             | 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变量(或匿名命名空间中的变量)可以私密,除了它对源文件中跟随它的所有代码可见(这会稍微改变可访问性)。

出于那些客观原因,我个人更喜欢它们。 我倾向于将我的标题保持为空,因为它使更改对客户端没有任何影响更容易(并且我大多数时候都是客户端!)

注意:如果我忘记了差异,请告诉/编辑

静态仅表示您希望变量在该文件中可用,对于私有,它仅表示该类。 在某些情况下,它们大致相同,但我倾向于先选择静态,因为它是一个编译时变量而不是运行时自动变量。 虽然这确实取决于编译器优化。

我通常在有一个函数或变量时,我希望在驻留在同一文件中的类之间共享。 在Java中,我认为这可以(我在这里猜测)通过内部类实现。 我认为只要头文件的外部用户可见界面不依赖于它们,它就是无害的。

没有static全局变量这样的东西:你所看到的是具有文件范围的static变量。 (至少,我的C ++老师没有把这些称为全局;我不确定标准是什么叫这些。)

但是,它们具有全局变量的所有优点以及全局变量的所有缺点,除了一个:如果它们具有相同的名称,它们不会相互冲突。

例如,以下内容不会链接:

// in a.cpp
static int a;
int b;

// in a.cpp
static int a;
int b;

因为全局符号b出现两次。 然而, a没有问题。

static类变量的区别在于它们出现在标头中,因此更改,删除或添加它们需要重新编译所有客户端代码。

和你一样,我通常更喜欢在.h文件中使用class static而不是在.cpp文件中使用全局static

但是, 一次,我宁愿全球static 这是因为它避免了在.h文件中需要一个#include指令(来访问static变量类型的声明)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM