gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:13:05 25 4
gpt4 key购买 nike

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

最佳答案

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

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

  • 另一方面,静态全局变量就像一个普通的全局变量 除了 它仅对当前编译单元“存在”。除了这个特定的 .cpp 文件,您不能在任何地方使用它。
    如果有两个编译单元(cpp 文件)具有相同的全局变量 int a,则使用通常的全局变量,代码将无法编译。更多内容: C/C++ global vs static global
    此外,您可以在使用静态全局变量(或方法,甚至类型)的任何地方使用匿名命名空间。
    UPD.:这里还有另一个区别。当你把你的 keyStates作为静态全局(或匿名命名空间的一部分)进入 cpp 文件,实现细节从类定义和 .h 文件中隐藏。因此,您可以随时更改它,而无需更改界面并且必须重新编译除 cpp 文件之外的任何内容。

    关于c++ - 在 .h 文件中的类中声明静态变量和在 .cpp 文件中声明 "global"变量有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62848434/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com