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