类作用域常量:常量与静态常量

Class scope constants: const vs static const

本文关键字:常量 静态 作用域      更新时间:2023-10-16

对于类的常量,我应该使用类范围静态常量还是文件作用域常量?

例如:

// .h
class C {
  private:
    static const int some_constant_c;
}
// .cc
const C::some_constant_c = 10;

与。

// .h
class C {
}
// .cc
const some_constant_c = 10;

对我来说,前者具有更好的语义含义,即常量属于某个类,但后者的优点是不会将常量暴露给头文件。

====

==========

关于这个问题的一个后续问题:

如果我希望我的常量被子类访问怎么办。把static const放在protected有意义吗?示例如下:

// .h
class C {
  protected:
    static const int some_constant_c;
}

当然,这是个人喜好的问题。尽量不在头文件中公开类内部是一艘绝对在C++航行的船......在成员变量和私有成员函数之间,将实现详细信息排除在标头之外是不切实际的(除非您使用的是 pImpl 惯用语)。

如果您只想隐藏常量的值,请注意,您可以改为将初始值设定项放在源文件中。

如果确实将常量实现为源文件中的全局变量,请使用匿名命名空间来防止它们导致链接器冲突。

我更喜欢第二个变体,前提是第一种情况下的常量是私有的。

为什么要用冗余信息污染类声明?考虑一下,您正在实现一个协议解析器,其中包含许多常量。类声明将是什么样子的?

另一个问题是,为什么要键入两次常量的名称?我尽量保持定义和初始化

只是一个意见。