0

我是 C++ 的新手(来自 C#),我想从一开始就得到那些记忆的东西。
在下面的片段中,一个类型的变量WorldChunkCoordinates按值传递给内联构造函数,WorldChunk然后将传递的坐标分配给WorldChunk::Coordinates,我相信这也是一个复制操作。
(复制分配操作?)

如果我的假设是正确的,那么这会有点愚蠢,因为我复制了两次实例。我认为如果我通过值传递并通过引用指针分配会更好。但是WorldChunk::Coordinates既不是指针也不是引用。

WorldChunk(WorldChunkCoordinates Coordinates) {
   WorldChunk::Coordinates = Coordinates;
}

有没有办法保护我的程序免于复制实例两次?
如果是这样,怎么做?

另外:默认情况下分配 by = 总是一个复制操作吗?
并且:我怎么知道一个特定的类可能有另一个通过引用复制的复制分配操作?

4

3 回答 3

3

它是一个已知且已解决的问题,称为初始化列表(不要与容器混淆)。好像

 WorldChunk(WorldChunkCoordinates Coordinates) : Coordinates(Coordinates){} 

考虑对变量名使用小写字母。

你也可以使用

 WorldChunk(const WorldChunkCoordinates &Coordinates) : Coordinates(Coordinates){} 

但取消引用比复制更快并不明显,尤其是在考虑编译器优化时。

于 2015-06-19T13:42:42.850 回答
1

首先是一个简单的解决方案:

将您的方法更改为:

WorldChunk(const WorldChunkCoordinates& Coordinates) {  WorldChunk::Coordinates = Coordinates;}

这将导致单个分配指令,因为坐标是参考。

默认构造的赋值运算符按成员分配。赋值运算符的参数(通常)是对对象的 const 引用,因此您不会复制参数。

顺便说一个小教程:http ://www.cplusplus.com/doc/tutorial/在我看来这非常好。

于 2015-06-19T13:41:08.653 回答
0

C++ 中用户类型函数参数的约定是通过 const 引用 (const MyType&) 传递输入参数,并通过引用传递输入参数 (MyType&)。

于 2015-06-19T13:41:41.213 回答