在传递和分配

时间:2015-06-19 13:34:39

标签: c++ memory pass-by-value copy-assignment

我是C ++的新手(来自C#),我想从一开始就获得那些内存。
在下面的剪切中,WorldChunkCoordinates类型的变量按值传递给WorldChunk的内联构造函数,然后传递的坐标分配给WorldChunk::Coordinates,我认为这也是一个复制操作。
(复制分配操作?)

如果我的假设是正确的,那么这将是有点愚蠢的,因为我复制了两次实例。如果我按值传递并通过 reference 指针分配,我认为它会更高效。但WorldChunk::Coordinates不是指针也不是参考。

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

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

另外:默认情况下是指定=复制操作吗?
并且:我应该如何知道某个特定类可能有另一个通过引用复制的复制分配操作?

3 个答案:

答案 0 :(得分:3)

它是一个已知且已解决的问题,称为initializer list(不要与容器混淆)。看起来像

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

考虑使用小写字母表示变量名称。

您也可以使用

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

但是,解除引用的速度并不明显,尤其是考虑到编译器优化时。

答案 1 :(得分:1)

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

将您的方法更改为:

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

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

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

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

答案 2 :(得分:0)

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