为什么使用静态const(int / string / ..)如果可以将它私有化?

时间:2017-05-09 11:05:37

标签: c++ class static const private

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

如果它是严格的private,则该类的每个实例都将获得自己的版本(尽管有优化器)。

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

3 个答案:

答案 0 :(得分:5)

尽管有"优化器,你自己也暗示了答案。#34;相信编译器并且目标明确。

确实你在这里是正确的,还要注意试图修改声明为const的变量的行为是 undefined 的更强的条件。所以你不能使用const_cast s和指针& c来解决这个问题。

做任何最自然的事情。是的,这是主观的,但对于它的价值,我倾向于使用private自动变量而不是private static变量作为(i)它的变量更加对称,(ii)重构到protectedpublic以及(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可能会失败。