如果可以将其置于私有状态,为什么还要使用 static const (int/string/..)?

Why use static const (int/string/..) if you can put it in private?

在 C++ 中,标记为 static 的成员由给定 class 的所有实例共享。是否私有并不影响一个变量被多个实例共享这一事实。如果有任何代码试图修改它,在那里设置 const 会警告你。

如果它是严格的 private,那么 class 的每个实例都会有自己的版本(尽管有优化器)。

^这是我读到的here。我的问题是,为什么使用 static const int 而不是将所需的变量放在 private 中更好?我知道每个对象都会有自己的对象,但为什么不好?

您用 "optimizer notwithstanding" 暗示了自己的答案。相信编译器并以清晰为目标。

确实你在这里是对的,还要注意更强的条件,即尝试修改声明为 const 的变量的行为是 undefined。所以你不能使用 const_casts 和指针 &c.

来解决这个问题

做任何感觉最自然的事情。是的,这是主观的,但就其价值而言,我倾向于使用 private 自动变量而不是 private static 变量,因为 (i) 它更对称,(ii) 重构为 protectedpublic 和 (iii) private 成员与基本成员初始化一起工作得更好。

I know each object would get its own, but why is it bad?

因为如果每个对象都不需要它自己的对象,那么您就浪费了资源并且class实现了不能准确表示其语义的实现。

此外,statics 可能会在某些成员不能引用的上下文中引用(例如,传递给 C API)。

定义大多数常量的全部意义在于只有一个。例如,如果我定义 const double pi = 3.14159...;,我肯定不希望该值的第二个实例存在。否则我会怀疑 a.pi 是否真的与 b.pi 相同。当我知道它被声明为 static const 时,我确定 a.pi == b.pi。对于像 enums 或位域常量的典型 static const 值也是如此。

同时注意 建议:非静态 const 消耗的内存与非常量数据成员一样多。如果您未能声明您的常量 static,您的对象就会显着膨胀。

最后,非静态 const 成员有很好的用例:这些取决于对象的初始化方式,但保证在对象的 生命周期 期间不会改变目的。于是,下面

const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);

可以合理地预期会成功(我们正在谈论 C++,所以一切皆有可能,包括常量更改!),即使 a.nonStaticConstant == b.nonStaticConstant 可能会失败。