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