C++中的静态变量

bre*_*ett 64 c++ static scope

我想知道头文件中的静态变量与类中声明的静态变量之间的区别.在头文件中声明静态变量时,其范围仅限于.h文件或所有单元.一般来说静态变量在类中声明时在.cpp文件中初始化了吗?那么这是否意味着静态变量范围仅限于2个编译单元?

Dev*_*lar 89

对不起,当我无序回答你的问题时,这样就更容易理解了.

在头文件中声明静态变量时,其范围仅限于.h文件或所有单元.

没有"头文件范围"这样的东西.头文件包含在源文件中.翻译单元是源文件,包括头文件中的文本.无论你在头文件中写什么,都会被复制到每个包含源文件中.

因此,在头文件中声明的静态变量就像每个单独源文件中的静态变量.

由于声明一个变量static这种方式意味着内部连接,每个翻译单元#include荷兰国际集团的头文件中获取自己的,单独的变量(不可见您的翻译单位外).这通常不是你想要的.

我想知道头文件中的静态变量与类中声明的静态变量之间的区别.

在类声明中,static表示该类的所有实例共享此成员变量; 也就是说,您可能有数百个此类对象,但只要其中一个对象引用static(或"类")变量,它就是所有对象的相同值.您可以将其视为"全球级".

一般来说静态变量在类中声明时在.cpp文件中初始化了吗?

是的,一个(也是唯一一个)翻译单元必须初始化类变量.

那么这是否意味着静态变量范围仅限于2个编译单元?

就像我说的:

  • 标头不是编译单元,
  • static 意味着完全不同的东西取决于背景.

全局static限制翻译单位的范围.类static对所有实例都是全局的.

我希望这有帮助.

PS:检查Chubsdad的答案的最后一段,关于你不应该如何static在C++中用于指示内部链接,而是匿名命名空间.(因为他是对的.;-))

  • "静态意味着完全不同的东西,取决于背景." - >关于它的最混乱的根源.这种"不添加关键词"的心态真的很烦人:( (10认同)

Chu*_*dad 48

头文件中的静态变量:

'common.h'

static int zzz;
Run Code Online (Sandbox Code Playgroud)

此变量'zzz'具有内部链接(在其他翻译单元中无法访问此相同变量).每个包含的翻译单元'common.h'都有自己唯一的名称对象'zzz'.

类中的静态变量:

类中的静态变量不是类的子对象的一部分.该类的所有对象共享的静态数据成员只有一个副本.

$ 9.4.2/6 - "命名空间范围内的类的静态数据成员具有外部链接(3.5).本地类不应具有静态数据成员."

所以我们可以说'myclass.h'

struct myclass{
   static int zzz;        // this is only a declaration
};
Run Code Online (Sandbox Code Playgroud)

并且myclass.cpp

#include "myclass.h"

int myclass::zzz = 0           // this is a definition, 
                               // should be done once and only once
Run Code Online (Sandbox Code Playgroud)

并且"hisclass.cpp"

#include "myclass.h"

void f(){myclass::zzz = 2;}    // myclass::zzz is always the same in any 
                               // translation unit
Run Code Online (Sandbox Code Playgroud)

并且"ourclass.cpp"

#include "myclass.h"
void g(){myclass::zzz = 2;}    // myclass::zzz is always the same in any 
                               // translation unit
Run Code Online (Sandbox Code Playgroud)

因此,类静态成员不仅限于2个翻译单元.它们只需在任何一个翻译单元中定义一次.

注意:不推荐使用'static'来声明文件范围变量,并且未命名的命名空间是一种优越的替代方法

  • 和+1表示匿名命名空间取代全局变量的`static`修饰符. (3认同)

Gou*_*ham 14

在类外部的头文件中声明的静态变量将位于包含头的file-scoped每个.c文件中.这意味着在包含头文件的每个.c文件中都可以访问具有相同名称的变量的单独副本.

另一方面,静态类变量class-scoped是,每个编译单元都可以使用相同的静态变量,包括带有静态变量的类的头.