2017-05-09 30 views
3

在C++中,标记为static的成员由给定类的所有实例共享。无论是否为私有都不会影响一个变量由多个实例共享的事实。如果有任何代码会尝试修改它,那么在那里有const会警告你。为什么使用静态const(int/string/..)如果你可以把它设置为私有?

如果这是严格的private,那么类的每个实例都会得到它自己的版本(尽管有优化器)。这是我读的here。我的问题是,为什么static const int而不是将所需的变量放在private?我知道每个对象都会有自己的,但为什么它不好呢?

回答

5

你暗示自己的答案是“优化器尽管”。相信编译器,并确保清晰。

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

做什么感觉最自然。是的,它是主观的,但对于什么是值得我倾向于使用private自动变量,而不是privatestatic变量(我)这是更对称,(ii)其是简单重构为protectedpublic及(iii)private成员与基地更好地工作成员初始化。

+0

我明白。非常感谢你! – Yanketz

1

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

因为如果每个对象都不需要它自己的,你就浪费了资源并且做出了一个不能准确表示它的语义的类实现。

另外,static可能在成员不能(例如传递给C API)的某些上下文中被引用。

0

定义大多数常量的重点是只有一个。例如,如果我定义const double pi = 3.14159...;,我当然不希望存在该值的第二个实例。否则,我不得不怀疑a.pi是否与b.pi确实相同。当我知道它被宣布为static const时,我确定那a.pi == b.pi。典型的static const值与enum s或位域常数一样。

另请参阅:BoundaryImposition's建议:非静态const消耗与非常量数据成员一样多的内存。如果你没有声明你的常量static,那么你的对象显着膨胀。

最后,有良好的用例非静态常量成员:这取决于对象的初始化,但保证了对象的生命周期期间不改变。因此,下面的

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

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

相关问题