如果可以将其置于私有状态,为什么还要使用 static const (int/string/..)?
Why use static const (int/string/..) if you can put it in private?
在 C++ 中,标记为 static
的成员由给定 class 的所有实例共享。是否私有并不影响一个变量被多个实例共享这一事实。如果有任何代码试图修改它,在那里设置 const 会警告你。
如果它是严格的 private
,那么 class 的每个实例都会有自己的版本(尽管有优化器)。
^这是我读到的here。我的问题是,为什么使用 static const int
而不是将所需的变量放在 private
中更好?我知道每个对象都会有自己的对象,但为什么不好?
您用 "optimizer notwithstanding" 暗示了自己的答案。相信编译器并以清晰为目标。
确实你在这里是对的,还要注意更强的条件,即尝试修改声明为 const
的变量的行为是 undefined。所以你不能使用 const_cast
s 和指针 &c.
来解决这个问题
做任何感觉最自然的事情。是的,这是主观的,但就其价值而言,我倾向于使用 private
自动变量而不是 private
static
变量,因为 (i) 它更对称,(ii) 重构为 protected
或 public
和 (iii) private
成员与基本成员初始化一起工作得更好。
I know each object would get its own, but why is it bad?
因为如果每个对象都不需要它自己的对象,那么您就浪费了资源并且class实现了不能准确表示其语义的实现。
此外,static
s 可能会在某些成员不能引用的上下文中引用(例如,传递给 C API)。
定义大多数常量的全部意义在于只有一个。例如,如果我定义 const double pi = 3.14159...;
,我肯定不希望该值的第二个实例存在。否则我会怀疑 a.pi
是否真的与 b.pi
相同。当我知道它被声明为 static const
时,我确定 a.pi == b.pi
。对于像 enum
s 或位域常量的典型 static const
值也是如此。
同时注意 建议:非静态 const
消耗的内存与非常量数据成员一样多。如果您未能声明您的常量 static
,您的对象就会显着膨胀。
最后,非静态 const 成员有很好的用例:这些取决于对象的初始化方式,但保证在对象的 生命周期 期间不会改变目的。于是,下面
const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);
可以合理地预期会成功(我们正在谈论 C++,所以一切皆有可能,包括常量更改!),即使 a.nonStaticConstant == b.nonStaticConstant
可能会失败。
在 C++ 中,标记为 static
的成员由给定 class 的所有实例共享。是否私有并不影响一个变量被多个实例共享这一事实。如果有任何代码试图修改它,在那里设置 const 会警告你。
如果它是严格的 private
,那么 class 的每个实例都会有自己的版本(尽管有优化器)。
^这是我读到的here。我的问题是,为什么使用 static const int
而不是将所需的变量放在 private
中更好?我知道每个对象都会有自己的对象,但为什么不好?
您用 "optimizer notwithstanding" 暗示了自己的答案。相信编译器并以清晰为目标。
确实你在这里是对的,还要注意更强的条件,即尝试修改声明为 const
的变量的行为是 undefined。所以你不能使用 const_cast
s 和指针 &c.
做任何感觉最自然的事情。是的,这是主观的,但就其价值而言,我倾向于使用 private
自动变量而不是 private
static
变量,因为 (i) 它更对称,(ii) 重构为 protected
或 public
和 (iii) private
成员与基本成员初始化一起工作得更好。
I know each object would get its own, but why is it bad?
因为如果每个对象都不需要它自己的对象,那么您就浪费了资源并且class实现了不能准确表示其语义的实现。
此外,static
s 可能会在某些成员不能引用的上下文中引用(例如,传递给 C API)。
定义大多数常量的全部意义在于只有一个。例如,如果我定义 const double pi = 3.14159...;
,我肯定不希望该值的第二个实例存在。否则我会怀疑 a.pi
是否真的与 b.pi
相同。当我知道它被声明为 static const
时,我确定 a.pi == b.pi
。对于像 enum
s 或位域常量的典型 static const
值也是如此。
同时注意 const
消耗的内存与非常量数据成员一样多。如果您未能声明您的常量 static
,您的对象就会显着膨胀。
最后,非静态 const 成员有很好的用例:这些取决于对象的初始化方式,但保证在对象的 生命周期 期间不会改变目的。于是,下面
const int before = a.nonStaticConstant;
a.modify();
assert(a.nonStaticConstant == before);
可以合理地预期会成功(我们正在谈论 C++,所以一切皆有可能,包括常量更改!),即使 a.nonStaticConstant == b.nonStaticConstant
可能会失败。