2011-03-28 38 views
4

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

通过声明变量private是否有优势?这是不好的做法吗?或者这是正常的时候声明静态变量只用于类和其他人?

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

+0

澄清:您是否在使用*静态全局变量*在私有静态成员变量*上有优势? – 2011-03-28 18:20:00

+0

在'.cpp'文件中通过类的'.h'中声明的私有静态变量声明的静态全局变量 – Samaursa 2011-03-28 18:21:31

+0

* .cpp文件中的非静态全局变量将比静态全局变量,因为它可能与具有相同名称的另一个标识符与另一个文件发生冲突。 – aschepler 2011-03-28 18:30:20

回答

4

这种方式的主要优点是减少* .h文件中“不必要”的东西的数量。这可能会稍微改进编译时间和/或重建文件或修改时的复杂性,并且可能会使头文件稍微易于阅读。

(在我看来,这些优点是体积小,和我平时会喜欢把逻辑上是在类的范围涉及到一类事物的清晰度。)

但是,静态全局变量已过时,坏在C++中练习。如果没有其他合适的范围,则应使用匿名名称空间。

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

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

它们被认为是弃用,但至少在草案的最后两个版本(n3225和n3242)中已被删除。 C++委员会认识到它不是冗长的,也是C兼容的。有人可能会争辩说,因为C++带来了static关键字的重载,所以应该是那些应该删除的重载:) – 2011-03-28 19:04:50

0

仅当您希望变量在该文件中可用时,静态才有意义,对于私有而言,仅在该类中才有意义。在某些情况下,它们大致相同,但我倾向于首先选择静态,因为它是编译时变量而非运行时自动变量。尽管这取决于编译器优化。

0

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

0

有没有这样的事情作为一个static全局变量:你在看什么是static变量与文件范围。 (至少,我的C++老师并没有把这些叫做全局变量;我不确定这个标准叫什么)

但是,它们具有全局变量的所有优点,除了一个全局变量的所有缺点:它们如果他们有相同的名字,不要相互碰撞。

例如,以下将不链接:

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

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

因为全局符号b发生了两次。然而,a没有问题。

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

0

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

但是,有一个当我更喜欢全球static的场合。这是在.h文件中避免需要#include指令(以访问static变量类型的声明)。

3

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

从技术角度来看,也有一些差异:

       +----------------+-------------+ 
          | 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变量可以是私人除了它在源文件中遵循它的所有代码都可见(它会稍微改变可访问性)。

我个人比较喜欢他们那些客观的原因。我倾向于保持我的标题尽可能空,因为它使更改对客户端没有任何影响(我大部分时间都是客户端!)

注意:如果我忘记了区别,请执行告诉/编辑