在C ++中,标记为static
的成员由给定类的所有实例共享。它是否私有并不会影响一个变量由多个实例共享的事实。如果有任何代码会尝试修改它,那么在那里使用const会警告你。
如果它是严格的private
,则该类的每个实例都将获得自己的版本(尽管有优化器)。
^这就是我读到的here。我的问题是,为什么最好让static const int
而不是将所需的变量放在private
中?我知道每个对象都会有自己的,但为什么它不好?
答案 0 :(得分:5)
尽管有"优化器,你自己也暗示了答案。#34;相信编译器并且目标明确。
确实你在这里是正确的,还要注意试图修改声明为const
的变量的行为是 undefined 的更强的条件。所以你不能使用const_cast
s和指针& c来解决这个问题。
做任何最自然的事情。是的,这是主观的,但对于它的价值,我倾向于使用private
自动变量而不是private
static
变量作为(i)它的变量更加对称,(ii)重构到protected
或public
以及(iii)private
成员更简单,可以更好地使用基本成员初始化。
答案 1 :(得分:1)
我知道每个对象都会有自己的,但为什么不好呢?
因为如果每个对象都不需要自己的对象,那么就浪费了资源并创建了一个不能准确表示其语义的类实现。
此外,static
可能在某些成员不能的情况下被引用(例如,传递给C API)。
答案 2 :(得分:0)
定义大多数常量的重点是只有一个。例如,如果我定义const double pi = 3.14159...;
,我肯定不希望存在该值的第二个实例。否则,我不得不怀疑a.pi
是否与b.pi
完全相同。当我知道它被声明为static const
时,我确定a.pi == b.pi
。对于像static const
s或位域常量一样的典型enum
值也是如此。
另外注意BoundaryImposition's建议:非静态const
消耗的内存与非const数据成员一样多。如果你没有声明常量static
,那么你的对象就会大量膨胀。
最后,非静态const成员有很好的用例:这些用例取决于对象的初始化方式,但保证在对象的生命周期期间不会发生变化。因此,以下
const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);
可以合理地预期成功(我们正在谈论C ++,所以一切皆有可能,包括常量变化!),即使a.nonStaticConstant == b.nonStaticConstant
可能会失败。