2013-05-27 77 views
2

因此,C++爲類生成一個自動拷貝ctor。當類包含指針時會發生什麼?我們只是在我的大學裏測試了這個,並且對我的困惑,我們可以複製包含指針的對象,並且指針被拆分。C++:複製ctor和指針

obj a; 
a.push(20); 
a.push(100); 
obj b = a; 
b.pop(); 
b.push(500); 

現在a包含20,100和b包含20,500,即使值(20,100,500)使用指針存儲在鏈接列表中。這怎麼可能?

+2

這將產生一個淺拷貝。默認拷貝構造函數按值拷貝指針。所以你有兩個指針指向相同的內存。 – andre

+0

這是可能的,因爲它似乎是通過查看函數名稱來實現堆棧。你推了20,然後100,然後分配給b,然後你做了一個彈出意味着你刪除了100,而你在b中推了500,所以值應該是你所說的。 –

+1

是的,類成員被複制,如果這些類成員是指針,這意味着指針被複制。其他*它應該如何工作?! –

回答

0

指針是簡單的可複製值,這就是類的隱式拷貝構造函數如何處理它們。這有時被稱爲「淺」副本,因爲它不會複製指向的對象。

如果要將「所有權」語義附加到指針上,那麼您必須親自做這件事,通過爲包含它的類編寫自己的複製/移動操作,或者使用現有的智能指針類來完成該操作爲你。

例如,在這種情況下,您可以使用unique_ptr來防止將節點從一個列表複製到另一個列表(同時允許它們移入和移出列表)。或者你可以編寫你自己的拷貝構造函數和賦值操作符來複制指向的節點,而不僅僅是指針,以獲得「深層」的複製語義。

0

這取決於你的基礎類。如果obj是從具有拷貝構造函數的東西(它看起來像一個std棧類或其他東西)派生出來的,那麼它會做一個好的拷貝。我們可能需要查看整個代碼以及推送/流行來自何處​​。