在 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=
设为 delete
d(或 private
)Logger
。现在连想象中能够“替代”它的概念都没有了。保持其实例非 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;
现在,我们可以通过赋值给 a1
与 a2
相同的值:
a1 = a2;
或者我们可以简单地用 a2
的状态一次替换 a1
的状态:
a1.x = a2.x;
这两条语句的效果是一样的。它们都就地覆盖 a1
的状态。
所以不,没有“final”关键字仅禁用 一些 对成员的覆盖操作(即赋值),同时允许其他覆盖操作。
在 Java 中,final
关键字防止变量被重新分配以引用另一个 实例 ,但允许修改现有实例。在 C++ 中,赋值永远不会改变实例的身份,因此不需要类似的关键字。
我正在创建一个游戏引擎 class,它将有一个“记录器”成员。 像这样:
class Engine {
public:
const Logger logger;
Engine();
~Engine();
void init();
void start();
};
我的问题是是否可以制作“记录器”,这样我就不能覆盖变量,但仍然修改对象本身?
C++ 一开始就没有“替换”变量的概念,所以你要求的东西没有多大意义。写C++的时候最好忘记Java;它们是具有不同范例和概念的不同语言。
如果您想阻止 class 的用户从逻辑上“替换”它,在 C++ 中最接近的是 =
运算符。这实际上只是在现有对象上调用 operator=
函数,尽管通常我们通常实现该函数来将 all 状态从一个对象复制到另一个对象,因此从一个非常高的层次从角度来看,它可以被认为是类似的东西。
如果您不希望人们这样做,请将 operator=
设为 delete
d(或 private
)Logger
。现在连想象中能够“替代”它的概念都没有了。保持其实例非 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;
现在,我们可以通过赋值给 a1
与 a2
相同的值:
a1 = a2;
或者我们可以简单地用 a2
的状态一次替换 a1
的状态:
a1.x = a2.x;
这两条语句的效果是一样的。它们都就地覆盖 a1
的状态。
所以不,没有“final”关键字仅禁用 一些 对成员的覆盖操作(即赋值),同时允许其他覆盖操作。
在 Java 中,final
关键字防止变量被重新分配以引用另一个 实例 ,但允许修改现有实例。在 C++ 中,赋值永远不会改变实例的身份,因此不需要类似的关键字。