【问题标题】:What is the difference between declaring a static variable in a class in the .h file and a "global" variable in the .cpp file在 .h 文件中的类中声明静态变量和在 .cpp 文件中声明“全局”变量有什么区别
【发布时间】:2020-11-01 00:43:41
【问题描述】:

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

【问题讨论】:

  • 现在,试着把你的类变成一个巨大的类,有数百个方法,这样在一个.cpp文件中定义它们的所有方法是不切实际的,你必须把它分成几个.考虑到这一点,请尝试重新阅读您的问题,看看您是否能自己发现差异。
  • 主要区别在于keyStates 变量对其余代码的可见性。
  • Static = 类名称空间内的全局。
  • 另外,第一个示例中的 private 关键字也很重要。

标签: c++ scope static


【解决方案1】:

好吧,当你有一个类的静态成员时(无论是字段还是方法),它对于整个类都是“全局的”,所以:

  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++ global vs static global

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

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

【讨论】:

  • 感谢您的回答@smyatkin_max,您解决了一些问题。但是,我并没有询问任何“静态全局变量”,而是询问了 .cpp 文件中静态成员变量和没有静态的变量之间的区别。这个我还是不明白。
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 2010-10-30
  • 2016-12-19
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多