在c++中,有没有一种方法可以生成可变常量成员变量?比如java中的“final”关键字?

wkftcu5l  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(385)

我正在创建一个游戏引擎类,它将有一个“logger”成员。这样地:

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

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

我的问题是是否有可能使“logger”这样我就不能重写变量,但仍然修改对象本身?

yebdmbv4

yebdmbv41#

您所问的问题在c++中没有意义。考虑一下:

class A {
  public:
    int x;
};

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

现在,我们可以 a1 与相同的值 a2 通过分配:

a1 = a2;

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

a1.x = a2.x;

这两种说法具有相同的效果。它们都覆盖了 a1 到位。
因此,没有“final”关键字只禁用成员上的一些覆盖操作(即赋值),而允许其他覆盖操作。
在java中 final 关键字阻止重新分配变量以引用另一个示例,但允许修改现有示例。在c++中,赋值永远不会改变示例的标识,因此不需要类似的关键字。

wlp8pajw

wlp8pajw2#

c一开始就没有“替换”变量的概念,所以你所要求的没有任何意义。写c时最好忘记java;它们是不同的语言,具有不同的范式和概念。
如果您想阻止类的用户在逻辑上“替换”它,那么最接近c++的是 = 接线员。这实际上就是所谓的 operator= 在现有对象上的函数,尽管传统上我们通常实现该函数以将所有状态从一个复制到另一个,因此从非常高级的Angular 来看,它可以被认为是类似的事情。
如果你不想让别人这么做,那就做吧 operator=delete d(或 private )在 Logger . 现在甚至没有一个想象中的概念能够“取代”它。保持其示例为非- const 所有其他用途仍然可以使用。
如果有帮助的话,想象一下你的班级 Engine 不包含 Logger ,而是 Logger* 指向某个动态分配的对象。如果它是一个 Logger* const 然后指针将不被允许稍后指向其他地方,尽管 Logger 本身)将保持可变。这是最接近java的引用语义和 final 我可以举个例子。不过,我提醒不要使用不必要的动态分配:使用此选项仅用于心理比较目的!

相关问题