首页 > 解决方案 > 这些示例中的“静态”关键字是否有所不同?

问题描述

我刚刚意识到我不必要地使一个类成员静态。我想知道这是否有意义,或者它们之间有什么区别。所以我有:

struct Log
{
    int a;
    std::string text;
};

struct GUI
{
    GUI() = delete;
    static void doSomething() {}
    static inline int a;
    static inline Foo fooObj;
};

或者

struct GUI2
{
    GUI2() = delete;
    static void doSomething() {}
    int a;
    Foo fooObj;
};

所以你可以看到这个 GUI 类总是会被范围操作符 GUI:: 访问,而不是点成员操作符,我不会创建它的任何实例,它是完全静态的。所以两个 GUI 类中的 int 和 Foo 对象要么有“static”关键字,要么没有。在 GUI 类不会被实例化的情况下,我不相信这会有所作为。作为最佳实践,最好不要使用 static 关键字吗?另外,如果两者之间有任何区别怎么办?我只是注意到我认为这对我的情况没有影响。

标签: c++classstaticmember

解决方案


struct GUI2
{
    GUI2() = delete;
    static void doSomething() {}
    int a;
    Foo fooObj;
};

int main() {
    GUI2::a = 0; // error
}

如果GUI2::a不是静态成员,它只存在于GUI对象中。这意味着它不能被访问,GUI2::a因为没有实例a附加到类。你需要一个实例:

GUI2 gui;
gui.a = 0; // OK

如果GUI2::a是静态成员,则它与对象分离并独立存在(并且必须在int GUI::a;某处定义):

GUI2::A = 0; // OK

这些示例中的“静态”关键字是否有所作为?

是的,它确实。


推荐阅读