簡體   English   中英

在.h 文件中的 class 中聲明 static 變量和在 .cpp 文件中聲明“全局”變量有什么區別

[英]What is the difference between declaring a static variable in a class in the .h file and a “global” variable in the .cpp file

我不知道我的標題是否用正確的術語表達,如果不是,請糾正我,以便我更新它。 然而,這是我用代碼示例表達的問題:當涉及到 keyStates 變量時,示例 A 和 B 之間有什么區別?

示例 A(其中“keyStates”變量在 .h 文件的 class 中定義為 static 變量):

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

好吧,當您擁有 class 的 static 成員(無論是字段還是方法)時,它對於整個 class 都是“全局的”,因此:

  1. 要從需要使用ClassName::method()ClassName::field的任何地方訪問它。
  2. 您可以使用訪問修飾符共享或限制對該成員的訪問:private、public 和 ptorected。
  3. 該成員屬於 class,不屬於任何特定對象。 您不能從此類方法中使用this限制的完整列表在那里: https://en.cppreference.com/w/cpp/language/static

另一方面,static 全局變量就像一個普通的全局變量,只是它僅對當前編譯單元“存在”。 除了這個特定的.cpp 文件,您不能在任何地方使用它。 如果有兩個具有相同全局變量int a的編譯單元(cpp 文件)使用通常的全局變量,則代碼將無法編譯。 這里有更多內容: C/C++ global vs static global

此外,您可以在使用 static 全局變量(或方法,甚至類型)的任何地方使用匿名命名空間。

UPD.:這里還有另一個區別。 當您將keyStates作為 static 全局(或匿名命名空間的一部分)放入 cpp 文件時,實現細節從 class 定義和 .h 文件中隱藏。 因此,您可以隨時更改它,而無需更改界面並且必須重新編譯除 cpp 文件之外的任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM