C ++中的静态variables

我想知道什么是一个头文件中的静态variables与在类中声明的区别。 在头文件中声明静态variables时,其范围限于.h文件或所有单元。 也一般静态variables是在.cpp文件中初始化时声明在一个类权利? 那么这是否意味着静态variables范围仅限于2个编译单元?

对不起,当我无序回答你的问题,这使得这种方式更容易理解。

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

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

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

由于以这种方式声明一个variablesstatic意味着内部链接,所以每个包含头文件的翻译单元都会获得自己的variables(在翻译单元之外不可见)。 这通常不是你想要的。

我想知道什么是一个头文件中的静态variables与在类中声明的区别。

在类声明中, static意味着类的所有实例共享这个成员variables; 即,您可能有数百个此types的对象,但是只要这些对象中的一个引用了static (或“类”)variables,它就是所有对象的相同值。 你可以把它看作是“全球一stream”。

也一般静态variables是在.cpp文件中初始化时声明在一个类权利?

是的, 一个 (也是唯一的)翻译单元必须初始化类variables。

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

就像我说的:

  • 标题不是一个编译单元,
  • static意味着根据上下文完全不同的东西。

全局static限制了翻译单元的范围。 类static意味着全局到所有实例。

我希望这有帮助。

PS:查看Chubsdad答案的最后一段,讲述如何在C ++中不使用static指示内部链接,而是使用匿名名称空间。 (因为他是对的;-))

头文件中的静态variables:

'common.h'

 static int zzz; 

这个variables'zzz'有内部连接(这个variables不能在其他翻译单元中被访问)。 包含'common.h'每个翻译单元都有自己独特的名称'zzz'对象。

类中的静态variables:

类中的静态variables不是类的子对象的一部分。 只有一个静态数据成员的副本由类的所有对象共享。

$ 9.4.2 / 6 – “名称空间范围内类的静态数据成员具有外部链接(3.5)。本地类不应具有静态数据成员。

那么让我们说'myclass.h'

 struct myclass{ static int zzz; // this is only a declaration }; 

myclass.cpp

 #include "myclass.h" int myclass::zzz = 0 // this is a definition, // should be done once and only once 

"hisclass.cpp"

 #include "myclass.h" void f(){myclass::zzz = 2;} // myclass::zzz is always the same in any // translation unit 

"ourclass.cpp"

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

所以,类静态成员不仅限于2个翻译单元。 他们只需要在任何一个翻译单位中定义一次。

注意:“静态”声明文件范围variables的用法已被弃用,而未命名的名称空间是上级备用

在类之外的头文件中声明的静态variables将在包含头的每个.c文件中进行file-scoped 。 这意味着可以在包含头文件的每个.c文件中访问具有相同名称的variables的单独副本。

另一方面,静态类variables是class-scoped并且每个编译单元都可以使用相同的静态variables,该静态variables包含包含具有静态variables的类的头。

在c或c ++中,用static关键字创build的静态variables称为静态variables。 这有助于内存pipe理,所以我们可以说它可以节省内存。 当它第一次创build时,只有一次性的内存被分配给静态variables,下一次它使用由编译器创build的前一个内存。 [更多详细信息: – ] http://www.codeverb.com/c-variables