为什么要使用静态常量(int/string/...),如果可以将其放在私有部分中?

3

C++中,标记为static的成员被给定类的所有实例共享。无论它是私有的还是公有的,都不影响一个变量被多个实例共享的事实。在那里添加const将会警告您是否有任何代码试图修改它。

如果它严格地被设置为private,那么该类的每个实例将获得自己的版本(优化器除外)。

^这是我在这里读到的。我的问题是,为什么最好使用static const int而不是将期望的变量放入private中?我知道每个对象都会获得自己的变量,但为什么这样做不好呢?

3个回答

4

你自己提到了"优化器不考虑",这暗示了答案。相信编译器并追求清晰明了。

的确,在这里你是正确的,还要注意更强的条件,即尝试修改已声明为const的变量的行为是未定义的。因此,您无法使用const_cast和指针等方法绕过这个问题。

做任何感觉最自然的事情。是的,这是主观的,但值得一提的是,我倾向于使用private自动变量而不是privatestatic变量,因为(i)它更对称,(ii)更容易重构为protectedpublic,(iii)private成员与基本成员初始化更好地配合。


我明白了。非常感谢! - user7582348

1
我知道每个对象都会有自己的,但这为什么是不好的呢?
因为如果每个对象都不需要自己的,那么你就浪费了资源,并且创建了一个不能准确表示其语义的类实现。
此外,在某些成员无法使用的情况下(例如传递给C API),可以引用静态变量。

0
定义大多数常量的整个意义在于只有一个。例如,如果我定义const double pi = 3.14159...;,我肯定不希望存在第二个该值的实例。否则,我就得想一想a.pi是否真的与b.pi相同。当我知道它被声明为static const时,我可以确定a.pi == b.pi。对于典型的像enum或位域常量一样的static const值也是如此。
此外,请注意BoundaryImposition的建议:非静态const占用的内存与非常量数据成员一样多。如果您未将常量声明为static,则会显著增加对象的大小。
最后,有一些非静态const成员的良好使用案例:这些取决于对象的初始化方式,但保证在对象的生命周期中不会更改。因此,以下内容
const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);

可以合理地期望成功(我们在谈论C ++,因此任何事情都有可能发生,包括常量的更改!),即使a.nonStaticConstant == b.nonStaticConstant很可能失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接