这些示例中的 "static" 关键字是否有所作为?

Does the "static" keyword in these examples make a difference?

本文关键字:static 关键字 有所作为 是否      更新时间:2023-10-16

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

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 类不会被实例化的情况下,我认为这不会有什么不同。作为最佳实践,省略静态关键字是否更好?另外,如果两者之间有任何区别怎么办?我只是注意到我认为这对我的情况没有区别。

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

这些示例中的"静态"关键字是否有区别?

是的,确实如此。