如何最好地初始化和存储常量对象

how to best intialize and store constant objects?

本文关键字:存储 常量 对象 初始化 何最好      更新时间:2023-10-16

我对来自其他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);
}