命名空间内的 extern const 和静态 const 类成员之间的区别
Difference between extern const inside namespace and static const class member?
最好在某个中心点定义常量(例如某些字符串或数字)。为了保持代码的可读性,还希望能够方便地访问这些常量。在我研究实现这一目标的良好实践期间,我现在找到了以下两种解决方案(https://stackoverflow.com/a/9649425/2776093)。
FoodConstants.h:
namespace FoodConstants {
namespace Fruits {
extern const string Apple;
...
}
...
}
食物常数.cpp:
namespace FoodConstants {
namespace Fruits {
const string Apple = "apple" ;
...
}
...
}
食物常数2.h:
class FoodConstants {
public:
class Fruits {
public:
static const string Apple;
...
}
...
}
食物常数2.cpp:
const string FoodConstants::Fruits::Apple = "apple"
...
对于这两种解决方案,我都可以在包含 .h 的程序中的任何地方使用 FoodConstants::Fruits::Apple 访问苹果常量。初始化在同一编译单元中完成,避免了初始化问题。我注意到一个区别:对于第二个解决方案,我不能,例如,做一个"使用命名空间 FoodConstants"来缩写对 Fruits::Apple 的字符串常量的访问。
还有其他区别吗?有没有像这样组织常量的首选方法?
还有其他区别吗?
是的,有。我可以看到两个:
-
使用类解决方案,您可以控制可访问性(
public
/protected
/private
),这是命名空间解决方案无法实现的。 -
使用命名空间,您可以将声明拆分到多个文件中,而类解决方案则无法做到这一点,因为类定义(包含所有成员的声明)必须在单个文件中给出。
相关文章:
- 不允许运算符 const 参数调用 const 成员函数
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 如何避免将 const 和非 const 成员函数输入到模板中的代码重复
- 初始化 const 成员的正确方法
- 使用 Boost 对具有 const 成员的类进行序列化
- 非常量调用 const 成员函数失败,只读位置C++
- PIMPL类的设置应该是const成员函数
- 与其他静态const成员初始化静态常量成员
- decltype 不会推断 const 对象的 const 成员
- 如何初始化不是静态的const成员
- 如何使用常量变量初始化类的 const 成员变量
- 使用模板参数初始化静态 const 成员
- 与const成员配对的向量
- 通过参考const成员通过参考时,尝试引用已删除的函数
- const成员初始化之前的用法是GCC和Clang的这种预期行为
- 通过const成员变量访问内联函数
- 与const成员一起安排新的和班级的分配
- 在const函数中调用非CONST成员的非const函数
- 为什么即使对于 "copy on write" 的 const 成员函数也返回一个代理类?