在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别

What is the difference between declaring a static variable in a class in the .h file and a "global" variable in the .cpp file

本文关键字:变量 声明 文件 global 什么 区别 静态 cpp      更新时间:2023-10-16

我不知道我的标题是否用正确的术语表达,如果没有,请纠正我,以便我可以更新它。然而,这是我用代码示例表达的问题:当涉及到keyStates变量时,示例A和B之间有什么区别?

示例A(其中"keyStates"变量被定义为.h文件中类中的静态变量(:

// Input.h
class Input
{
public:
static bool GetKeyDown(KeyCode keycode);
private:
static std::unordered_map<KeyCode, KeyState> keyStates;
}
// Input.cpp
#include "Input.h"
bool Input::GetKeyPressed(KeyCode keyCode)
{
for (auto Code : AllKeyCodes)
{
if (Code == keyCode)
{
return KeyState::PRESSED == keyStates.find(Code)->second;
}
}
return false;
}

示例B(其中"keyStates"变量在.cpp文件中定义为无静态(:

// Input.h
class Input
{
public:
static bool GetKeyDown(KeyCode keycode);
}
// Input.cpp
#include "Input.h"
std::unordered_map<KeyCode, KeyState> keyStates;
bool Input::GetKeyPressed(KeyCode keyCode)
{
for (auto Code : AllKeyCodes)
{
if (Code == keyCode)
{
return KeyState::PRESSED == keys.find(Code)->second;
}
}
return false;
}

好吧,当你有一个类的静态成员(无论是字段还是方法(时,它就是"全局";对于整个班级,这样:

  1. 要从任何位置访问它,您需要使用ClassName::method()ClassName::field
  2. 您可以使用访问修饰符共享或限制对此成员的访问:private、public和ptorected
  3. 此成员属于类,而不属于任何特定对象。不能从此类方法中使用this限制的完整列表如下:https://en.cppreference.com/w/cpp/language/static

另一方面,静态全局变量就像一个常见的全局变量,除了它"存在";仅适用于当前编译单元。除了这个特定的.cpp文件之外,您不能在任何地方使用它。对于一个普通的全局变量,如果有两个编译单元(cpp文件(具有相同的全局变量int a,则代码不会编译。以下是关于这一点的更多信息:C/C++全局与静态全局

此外,您可以在任何使用静态全局变量(或方法,甚至类型(的地方使用匿名命名空间。

更新:这里还有另一个区别。当您将keyStates作为静态全局(或匿名命名空间的一部分(放入cpp文件中时,实现细节将从类定义和.h文件中隐藏。因此,您可以随时更改它,而无需更改接口,并且必须重新编译除cpp文件之外的任何内容。