C++中,标记为static
的成员被给定类的所有实例共享。无论它是私有的还是公有的,都不影响一个变量被多个实例共享的事实。在那里添加const
将会警告您是否有任何代码试图修改它。
如果它严格地被设置为private
,那么该类的每个实例将获得自己的版本(优化器除外)。
^这是我在这里读到的。我的问题是,为什么最好使用static const int
而不是将期望的变量放入private
中?我知道每个对象都会获得自己的变量,但为什么这样做不好呢?
C++中,标记为static
的成员被给定类的所有实例共享。无论它是私有的还是公有的,都不影响一个变量被多个实例共享的事实。在那里添加const
将会警告您是否有任何代码试图修改它。
如果它严格地被设置为private
,那么该类的每个实例将获得自己的版本(优化器除外)。
^这是我在这里读到的。我的问题是,为什么最好使用static const int
而不是将期望的变量放入private
中?我知道每个对象都会获得自己的变量,但为什么这样做不好呢?
你自己提到了"优化器不考虑",这暗示了答案。相信编译器并追求清晰明了。
的确,在这里你是正确的,还要注意更强的条件,即尝试修改已声明为const
的变量的行为是未定义的。因此,您无法使用const_cast
和指针等方法绕过这个问题。
做任何感觉最自然的事情。是的,这是主观的,但值得一提的是,我倾向于使用private
自动变量而不是private
static
变量,因为(i)它更对称,(ii)更容易重构为protected
或public
,(iii)private
成员与基本成员初始化更好地配合。
const double pi = 3.14159...;
,我肯定不希望存在第二个该值的实例。否则,我就得想一想a.pi
是否真的与b.pi
相同。当我知道它被声明为static const
时,我可以确定a.pi == b.pi
。对于典型的像enum
或位域常量一样的static const
值也是如此。const
占用的内存与非常量数据成员一样多。如果您未将常量声明为static
,则会显著增加对象的大小。const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);
可以合理地期望成功(我们在谈论C ++,因此任何事情都有可能发生,包括常量的更改!),即使a.nonStaticConstant == b.nonStaticConstant
很可能失败。