我正在创建一个游戏引擎类,它将有一个“logger”成员。这样地:
class Engine { public: const Logger logger; Engine(); ~Engine(); void init(); void start(); };
我的问题是是否有可能使“logger”这样我就不能重写变量,但仍然修改对象本身?
yebdmbv41#
您所问的问题在c++中没有意义。考虑一下:
class A { public: int x; }; A a1, a2; a1.x = 1; a2.x = 2;
现在,我们可以 a1 与相同的值 a2 通过分配:
a1
a2
a1 = a2;
或者我们可以简单地替换 a1 的状态 a2 的状态一次一件:
a1.x = a2.x;
这两种说法具有相同的效果。它们都覆盖了 a1 到位。因此,没有“final”关键字只禁用成员上的一些覆盖操作(即赋值),而允许其他覆盖操作。在java中 final 关键字阻止重新分配变量以引用另一个示例,但允许修改现有示例。在c++中,赋值永远不会改变示例的标识,因此不需要类似的关键字。
final
wlp8pajw2#
c一开始就没有“替换”变量的概念,所以你所要求的没有任何意义。写c时最好忘记java;它们是不同的语言,具有不同的范式和概念。如果您想阻止类的用户在逻辑上“替换”它,那么最接近c++的是 = 接线员。这实际上就是所谓的 operator= 在现有对象上的函数,尽管传统上我们通常实现该函数以将所有状态从一个复制到另一个,因此从非常高级的Angular 来看,它可以被认为是类似的事情。如果你不想让别人这么做,那就做吧 operator= 是 delete d(或 private )在 Logger . 现在甚至没有一个想象中的概念能够“取代”它。保持其示例为非- const 所有其他用途仍然可以使用。如果有帮助的话,想象一下你的班级 Engine 不包含 Logger ,而是 Logger* 指向某个动态分配的对象。如果它是一个 Logger* const 然后指针将不被允许稍后指向其他地方,尽管 Logger 本身)将保持可变。这是最接近java的引用语义和 final 我可以举个例子。不过,我提醒不要使用不必要的动态分配:使用此选项仅用于心理比较目的!
=
operator=
delete
private
Logger
const
Engine
Logger*
Logger* const
2条答案
按热度按时间yebdmbv41#
您所问的问题在c++中没有意义。考虑一下:
现在,我们可以
a1
与相同的值a2
通过分配:或者我们可以简单地替换
a1
的状态a2
的状态一次一件:这两种说法具有相同的效果。它们都覆盖了
a1
到位。因此,没有“final”关键字只禁用成员上的一些覆盖操作(即赋值),而允许其他覆盖操作。
在java中
final
关键字阻止重新分配变量以引用另一个示例,但允许修改现有示例。在c++中,赋值永远不会改变示例的标识,因此不需要类似的关键字。wlp8pajw2#
c一开始就没有“替换”变量的概念,所以你所要求的没有任何意义。写c时最好忘记java;它们是不同的语言,具有不同的范式和概念。
如果您想阻止类的用户在逻辑上“替换”它,那么最接近c++的是
=
接线员。这实际上就是所谓的operator=
在现有对象上的函数,尽管传统上我们通常实现该函数以将所有状态从一个复制到另一个,因此从非常高级的Angular 来看,它可以被认为是类似的事情。如果你不想让别人这么做,那就做吧
operator=
是delete
d(或private
)在Logger
. 现在甚至没有一个想象中的概念能够“取代”它。保持其示例为非-const
所有其他用途仍然可以使用。如果有帮助的话,想象一下你的班级
Engine
不包含Logger
,而是Logger*
指向某个动态分配的对象。如果它是一个Logger* const
然后指针将不被允许稍后指向其他地方,尽管Logger
本身)将保持可变。这是最接近java的引用语义和final
我可以举个例子。不过,我提醒不要使用不必要的动态分配:使用此选项仅用于心理比较目的!