在 C++ 中,有没有办法创建一个可变的 const 成员变量?就像 java 中的 "final" 关键字一样?

In C++, is there a way I can make a mutable const member variable? Like with the "final" keyword in java?

我正在创建一个游戏引擎 class,它将有一个“记录器”成员。 像这样:

class Engine {
public:
    const Logger logger;
    Engine();
    ~Engine();

    void init();
    void start();
};

我的问题是是否可以制作“记录器”,这样我就不能覆盖变量,但仍然修改对象本身?

C++ 一开始就没有“替换”变量的概念,所以你要求的东西没有多大意义。写C++的时候最好忘记Java;它们是具有不同范例和概念的不同语言。

如果您想阻止 class 的用户从逻辑上“替换”它,在 C++ 中最接近的是 = 运算符。这实际上只是在现有对象上调用 operator= 函数,尽管通常我们通常实现该函数来将 all 状态从一个对象复制到另一个对象,因此从一个非常高的层次从角度来看,它可以被认为是类似的东西。

如果您不希望人们这样做,请将 operator= 设为 deleted(或 privateLogger。现在连想象中能够“替代”它的概念都没有了。保持其实例非 const 并且所有其他用途仍然可访问。

如果有帮助,假设您的 class Engine 不包含 Logger,而是指向某个动态分配对象的 Logger*。如果它是一个 Logger* const,那么指针将不允许稍后指向别处,尽管指针(Logger 本身)将保持可变。这是最接近 Java 的引用语义和 final 我可以为这个例子收集的东西。 但是我警告不要进行不必要的动态分配:使用此选项仅用于心理比较目的!

你问的问题在 C++ 中没有意义。考虑一下:

class A {
  public:
    int x;
};

A a1, a2;
a1.x = 1;
a2.x = 2;

现在,我们可以通过赋值给 a1a2 相同的值:

a1 = a2;

或者我们可以简单地用 a2 的状态一次替换 a1 的状态:

a1.x = a2.x;

这两条语句的效果是一样的。它们都就地覆盖 a1 的状态。

所以不,没有“final”关键字仅禁用 一些 对成员的覆盖操作(即赋值),同时允许其他覆盖操作。

在 Java 中,final 关键字防止变量被重新分配以引用另一个 实例 ,但允许修改现有实例。在 C++ 中,赋值永远不会改变实例的身份,因此不需要类似的关键字。