我使用 AS3(面向对象的 Javascript)编写代码,并且正在学习 C++。
在 C++ 中,如果您执行 instance1 = instance2
,您似乎在复制 instance1
并将拷贝命名为 instance2
。不像 AS3 那样只有“字符串”和数字被复制,而其他类型被“引用”,因此两者都指向同一个对象(如 C++ 指针)。
所以我的问题是:
假设我有“战地风云 4”(或任何需要硬件的游戏)的源代码,并且我正在运行游戏主类的实例,如下所示:BattleField4 gameInstance = new BattleField4()
并且在游戏运行 5 分钟后执行以下代码:BattleField4 gameCopy = gameInstance
。
这是否意味着内存中加载的游戏进度和图形的“完整拷贝”?
如果游戏将 10Gb 的内存及其图形加载到 RAM 中,那么 gameCopy = gameInstance
之后会加载 20GB 吗?
感谢您的帮助,我希望我的英语很清楚。
最佳答案
在 C++ 中,如果您有一些类型为 Type
的对象 obj
,并且您执行:
obj = newObj;
其中 newObj
也是 Type
类型的对象,这将调用 Type
的复制构造函数。这会执行“完全复制”吗?
这取决于 Type
如何实现复制构造函数。看,在 C++ 中,允许类型选择创建拷贝时发生的情况。有时,它只是复制内部数据。有时,您必须在类型内实例化新对象,以便可以正确复制指针内部持有的更大对象。
有时,我们说所讨论的Type
具有“引用语义”。这意味着通过“复制”Type
对象,您得到的是两个独立的 Type
对象,它们在内部引用相同的数据。也就是说,它们都引用相同的东西。这是完全有效的,并在许多实用 C++ 类中使用。
有时,我们完全禁止复制。这通常是为不适合引用语义的对象完成的,并且复制它们太麻烦了。如果一款游戏要有一个巨大的整体对象来代表游戏,那么它要么是不可复制的,要么它的复制构造函数将完全损坏且无法正常工作(众所周知,游戏开发者对这些事情很懒惰)。
关于c++ - 关于 C++ 复制 (value1 = value2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18426056/