如何最好地初始化和存储常量对象
how to best intialize and store constant objects?
我对来自其他OOP语言的C++没有经验。
寻找一种初始化常量对象的方法,假设我有这个简单的向量:
Vector3D UP = Vector3D(0,1,0);
我想重用UP
变量后面的对象。
例如,在Java中,您可以将其设置为某个类中的静态字段:
class Constants {
public static final Vector3D UP = new Vector3D(0,1,0);
}
并且可以像这样访问它:
Vector3D up = Constants.UP;
C++,我如何安全地告诉它初始化该对象一次,然后在我包含标头的任何地方不可变地访问它?
我已经读到静态初始化在C++中可能非常糟糕,因为编译顺序是不确定的,如果你在不同常量之间有依赖关系,如果它们不在同一编译单元中,你最终可能会得到未定义的初始化状态。
如果Vector3D
是一个足够简单的类,一个文字类型,你可以为其定义一个constexpr
构造函数,那么最直接的方法可能是在标头中定义它,如下所示:
namespace Constants {
constexpr Vector3D UP(0,1,0);
}
这使得它是一个真正的编译时常数,因此它可能不占用存储(取决于您如何使用它(。如果它最终占用了存储空间,则constexpr
说明符意味着内部链接。每个需要常量来存储的翻译单元都有自己的常量副本。因此,您不会与静态初始化顺序的惨败相冲突(在单个 TU 中,命名空间范围静态对象的声明顺序决定了初始化顺序(。
自 C++17 以来,这些多个定义可以在inline
说明符的帮助下浓缩为一个。一个真正的常量将如下所示:
namespace Constants {
inline constexpr Vector3D UP(0,1,0);
}
相关文章:
- 如何为静态常量模板化专用整数值分配存储
- 常量参数存储在哪里 (C++)?
- 如何在可执行文件中存储常量数组?
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 有没有办法在类实例中存储编译时常量?
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 如何最好地初始化和存储常量对象
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 在 c++ 中存储文本常量
- std::to_string 存储在常量字符*中
- c++中用于常量数据的内存存储
- 常量存储在何处以及如何存储
- 传递给存储常量引用的成员的临时对象的生存期
- 如何将升压随机数生成器的状态存储为常量字符 *
- 其中C++内存中的文字常量存储
- 常量数据存储在哪里
- 如何将常量字符*存储到字符*
- 测试静态常量成员的存储位置
- 存储常量引用参数中的成员变量
- 在c++中存储常量