2016-11-14 46 views
0

如果非要含有构件阵列与指针在每个端部,例如一个类,C++交换来实现成员阵列和相关的指针

int mArray[5]; 
int *mStart = mArray; 
int *mEnd = mArray + 5; 

和我换该类,说在使用std::swap(mArray, other.mArray)我的标准赋值运算符,这个过程中的指针会发生什么?

这是一个非常人为的例子,但在我的程序中,如果我仅交换数组,则赋值运算符按预期工作,如果我尝试交换所有三个成员变量,则会崩溃。有任何想法吗?

+0

交换对象不会(不应该)影响静态数据成员,因为**静态数据成员不与任何对象**关联。不知道更多关于你的案例的语义,我们不能回答更多的问题。这味道像[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – bolov

+0

请提供一个[MCVE]没有它你的问题是无法回答的。 – bolov

+0

创建一个编译并运行的简单*示例,它可能会回答你的问题。 – WhozCraig

回答

1

即使更改存储在mArray中的值,该数组仍处于相同地址。所以指针仍然是正确的。

如果将指针值与另一个对象交换,则一个对象中的指针将指向另一个对象的数组。不会很好地工作!

而不是存储指针,你可以像标准容器一样做,并有一个begin成员返回一个指针/迭代器到数据。

int* begin() 
{ return mArray; } 

并且同样为end()

+0

我非常清楚使用迭代器是很好的做法。伟大的建议! – tomatoBisque

1

(假设这些都不是真正静态成员,但你的意思是他们没有动态分配。)

当你交换阵列,这些阵列不动;只有它们的内容被交换。
(数组不是指针)

如果交换指针,它不起作用的原因是指针指向它们“原始”对象的数组成员。
如果您不交换它们,它们会一直指向它们创建的数组。

Ilustrating例如:

起点:

Object A: mArray starts at 0x1000; mStart is 0x1000; mEnd is 0x1014 
Object B: mArray starts at 0x2000; mStart is 0x2000; mEnd is 0x2014 

swap而不指针交换后:

Object A: mArray starts at 0x1000; mStart is 0x1000; mEnd is 0x1014 
Object B: mArray starts at 0x2000; mStart is 0x2000; mEnd is 0x2014 

swap与指针交换后:

Object A: mArray starts at 0x1000; mStart is 0x2000; mEnd is 0x2014 
Object B: mArray starts at 0x2000; mStart is 0x1000; mEnd is 0x1014 
+0

有趣!我还是一个新手,我认为std :: swap将数组视为一个指针,并且将它作为一个常规指针进行交换。很高兴知道STL将数组视为对象,而不是指针。谢谢! – tomatoBisque