【问题标题】:Does the "static" keyword in these examples make a difference? [duplicate]这些示例中的“静态”关键字是否有所不同? [复制]
【发布时间】:2018-11-17 13:00:09
【问题描述】:

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

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 关键字吗?另外,如果两者之间有任何区别怎么办?我只是注意到我认为这对我的情况没有影响。

【问题讨论】:

  • @Ron 我将 GUI 类中的 Foo 和 int 成员对象设为静态,当 GUI 本身是静态类时,在这种情况下是否不需要静态?有什么区别吗?
  • C++ 中没有静态类这样的东西。
  • 如果你不打算创建它的任何实例,为什么要让它成为一个类呢?只需使用命名空间。
  • @CodingLumis 它给了我访问说明符,而且......我不记得还有什么,我折腾了是使用命名空间还是类,我决定使用类。

标签: c++ class static member


【解决方案1】:
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

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

是的。

【讨论】:

  • 啊,我糊涂了,当然有区别。我花了很长时间离开,忘记了规则。我确实需要将其设为静态。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多