繁体   English   中英

C ++中的静态变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM