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

安东·埃里克森

我不知道我的标题是否用正确的术语表示,如果不是,请更正我,以便我进行更新。但是,这是我用代码示例表达的问题:示例A和B之间的keyStates变量有什么区别?

示例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(其中在.cpp文件中定义了“ keyStates”变量而没有静态变量的情况):

// 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;
}
smyatkin_max

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

  1. 要从任何地方访问它,您需要使用ClassName::method()ClassName::field
  2. 您可以使用访问修饰符共享或限制对此成员的访问:私有,公共和保护。
  3. 该成员属于该类,而不属于任何特定对象。您不能通过this这种方法使用完整的限制列表在这里:https : //en.cppreference.com/w/cpp/language/static

另一方面,静态全局变量类似于通常的全局变量,只是它仅对于当前编译单元“存在”。除了此特定的.cpp文件,您不能在任何地方使用它。对于普通的全局变量,如果有两个具有相同全局变量的编译单元(cpp文件)int a,则代码将无法编译。这方面的更多信息:C / C ++全局vs静态全局

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

UPD:这里还有另一个区别。当您将keyStatescpp文件作为静态全局变量(或匿名命名空间的一部分)放入cpp文件时,实现细节将从类定义和.h文件中隐藏。因此,只要您不希望更改接口并不得不重新编译除cpp文件以外的任何内容,就可以进行更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java的非静态类中声明静态变量

在枚举类中声明一个静态变量

如何在python中打印类的声明静态变量

ref和全局变量之间有什么区别?

Ruby中的符号和变量之间有什么区别?

如何在c中全局初始化变量,静态和外部有什么区别?

在超类上声明最终静态变量与在扩展类上声明有什么区别?

在 h 文件中声明的全局变量和对它们的访问

类中的静态变量和内存分配及其使用

Ruby中的类常量和类实例变量之间有什么区别?

C中的全局变量和动态分配的v变量有什么区别?

Go中的短变量声明和长变量声明之间的闭包范围有什么区别?

在类中动态创建静态变量

类中的C ++静态变量

python类中的静态变量

在类中创建静态变量(C ++)

Java中的项目和文件之间有什么区别?

在.h文件中声明实例变量和@interface大括号内的.m之间的区别

类变量和实例变量之间有什么区别?

C ++中的静态类成员变量和静态变量

非静态类中私有静态变量的范围

匿名函数-声明全局变量和在php中使用之间有什么区别?

块中引用的实例变量和临时变量之间有什么区别?

Logger中的“文本”,变量和“文本” +变量之间有什么区别

java中的常量变量和最终变量之间有什么区别?

在Robot Framework中,列表变量和包含列表的标量变量之间有什么区别?

在server /和private /中定义全局变量有什么区别?

javascript中的全局变量和window.variable有什么区别?

全局变量和c中的#define有什么区别