c++ - 这些示例中的“静态”关键字是否有所不同?
问题描述
我刚刚意识到我不必要地使一个类成员静态。我想知道这是否有意义,或者它们之间有什么区别。所以我有:
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 关键字吗?另外,如果两者之间有任何区别怎么办?我只是注意到我认为这对我的情况没有影响。
解决方案
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
这些示例中的“静态”关键字是否有所作为?
是的,它确实。
推荐阅读
- flutter - Flutter MatrixGestureDetector - 最小和最大比例
- javascript - 如何强制测试套件首先运行并在失败时退出整个 Jest 执行?
- arrays - 在c中使用通用快速排序对char**数组进行排序
- css - 为单选按钮文本提供 nowrap
- c++ - 如何直接访问 QTableView 中的 QWidget?
- sql - 将分隔字符串拆分为多列和多行
- javascript - 在 js 中使用或条件的更好方法
- python - 根据两列比较和排列数据框中的行?
- java - 使用Java中的字符串库,给定字符串中子字符串的最大连续重复次数
- java - 如何在java中的字符串数组之间添加逗号/和