[英]Static variables in C++
我想知道头文件中的静态变量与类中声明的静态变量之间的区别。 在头文件中声明静态变量时,其范围仅限于.h文件或所有单元。 一般来说静态变量在类中声明时在.cpp文件中初始化了吗? 那么这是否意味着静态变量范围仅限于2个编译单元?
对不起,当我无序回答你的问题时,这样就更容易理解了。
在头文件中声明静态变量时,其范围仅限于.h文件或所有单元。
没有“头文件范围”这样的东西。 头文件包含在源文件中。 翻译单元是源文件, 包括头文件中的文本。 无论你在头文件中写什么,都会被复制到每个包含源文件中。
因此,在头文件中声明的静态变量就像每个单独源文件中的静态变量。
由于这种方式声明变量static
意味着内部链接,每个翻译单元#include
你的头文件都有自己的 单个变量(在你的翻译单元之外是不可见的)。 这通常不是你想要的。
我想知道头文件中的静态变量与类中声明的静态变量之间的区别。
在类声明中, static
表示该类的所有实例共享此成员变量; 也就是说,您可能有数百个此类型的对象,但只要其中一个对象引用static
(或“类”)变量,它就是所有对象的相同值。 您可以将其视为“全球级”。
一般来说静态变量在类中声明时在.cpp文件中初始化了吗?
是的, 一个 (也是唯一一个 )翻译单元必须初始化类变量。
那么这是否意味着静态变量范围仅限于2个编译单元?
就像我说的:
static
意味着根据上下文完全不同的东西。 全局static
限制了翻译单元的范围。 类static
意味着全局到所有实例。
我希望这有帮助。
PS:检查Chubsdad的答案的最后一段,关于如何在C ++中使用static
来指示内部链接,但是匿名命名空间。 (因为他是对的。;-))
头文件中的静态变量:
说'common.h'
有
static int zzz;
此变量'zzz'
具有内部链接(在其他翻译单元中无法访问此相同变量)。 每个包含'common.h'
翻译单元都有自己独特的名称'zzz'
对象。
类中的静态变量:
类中的静态变量不是类的子对象的一部分。 该类的所有对象共享的静态数据成员只有一个副本。
$ 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个翻译单元。 它们只需在任何一个翻译单元中定义一次。
注意:不推荐使用'static'来声明文件范围变量,并且未命名的命名空间是一种优越的替代方法
在类外部的头文件中声明的静态变量将在包含头的每个.c文件中进行file-scoped
。 这意味着在包含头文件的每个.c文件中都可以访问具有相同名称的变量的单独副本。
另一方面,静态类变量是class-scoped
并且每个编译单元都可以使用相同的静态变量,其中包含包含具有静态变量的类的标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.