提问者:小点点

在。h文件中声明类中的静态变量和在。cpp文件中声明“全局”变量有什么区别


我不知道我的标题是否用正确的术语表达,如果不是,请纠正我,以便我可以更新它。 然而,这是我用代码示例表达的问题:当涉及到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文件中定义时不带static):

// 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个答案

匿名用户

好吧,当你拥有一个类的静态成员(不管是字段还是方法)时,它对于整个类来说都是“全局的”,因此:

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

另一方面,静态全局变量就像通常的全局变量,只不过它只“存在”于当前编译单元。 除了这个特定的。cpp文件之外,您不能在任何地方使用它。 如果有两个具有相同全局变量int a的编译单元(cpp文件),则代码不会编译。 以下是更多的内容:C/C++全局vs静态全局

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

UPD:这里还有另一个不同之处。 当您将KeyStates作为静态全局文件(或匿名命名空间的一部分)放入cpp文件时,实现细节对类定义和。h文件是隐藏的。 因此您可以随时更改它,而不必更改接口,也不必重新编译除cpp文件之外的任何东西。