2016-11-14 55 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