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



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

如果它是严格private的,那么类的每个实例都会得到它自己的版本(尽管有优化器)。

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

你暗示自己用"尽管优化器"来回答。信任编译器并力求清晰。

事实上,您在这里是对的,还要注意更强的条件,即尝试修改声明为const的变量的行为是未定义的。所以你不能使用const_casts和指针&c来解决这个问题。

做任何感觉最自然的事情。是的,这是主观的,但就其价值而言,我倾向于使用private自动变量而不是privatestatic变量,因为 (i) 它更对称,(ii) 重构protectedpublic更简单,以及 (iii)private成员更好地使用基本成员初始化。

我知道每个对象都有自己的对象,但为什么它不好?

因为如果每个对象都不需要自己的对象,那么您就浪费了资源,并且制作了一个不能准确表示其语义的类实现。

此外,在某些成员无法引用的上下文中,可以引用statics(例如,传递给 C API)。

定义大多数常量的全部意义在于只有一个常量。例如,如果我定义const double pi = 3.14159...;,我肯定不希望该值的第二个实例存在。否则我不得不怀疑a.pi是否真的和b.pi一样.当我知道它被声明为static const时,我确定a.pi == b.pi。这同样适用于作用类似于enums 或位域常量的典型static const值。

还要注意 BoundaryImposition的建议:非静态const消耗的内存与非常量数据成员一样多。如果你没有声明你的常量static,你就会使你的对象明显膨胀。

最后,对于非静态 const 成员,有一些很好的用例:这些用例取决于对象的初始化方式,但保证在对象的生存期内不会更改。因此,以下

const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);

可以合理地期望成功(我们说的是C++,所以一切皆有可能,包括常量变化!),即使a.nonStaticConstant == b.nonStaticConstant可能会失败。

最新更新