2017-10-28 108 views
0

如果一個類有一個指針,我們必須通過重載賦值操作符來創建一個深度拷貝(淺拷貝不正確)。默認Assigment運算符是否適用於向量?

那麼,如果一個類有一個成員向量,是否有必要做一個深層複製(通過重載operator=)?

+0

關於術語的注意事項:您不要*重載*賦值運算符。超載有另一個含義。你在這裏做的是定義你自己的賦值運算符版本,而不是依靠編譯器自動生成的默認版本。 –

回答

1

std::vector可以自己照顧自己。你不需要做任何特別的事情。它有自己的賦值操作符來進行適當的複製。

+0

非常感謝。它也適用於陣列嗎? – tarktark

+1

@tarktark - 它有助於[閱讀手冊](http://en.cppreference.com/w/cpp/container/array)(查找'operator =') – rustyx

2

如果一個類有一個指針,我們必須用分配操作符 重載(而不是淺拷貝)來做深度拷貝。

僅當該指針是所謂的「擁有」指針時,即該類語義上擁有指向的資源並負責其最終的釋放或銷燬。

指針也可能是一個所謂的「觀察」指針,它指向代碼的另一部分負責的內容。觀察指針與參考相似。

請牢記這一點,然後才能盲目地在各處實施深度複製。

那麼如果一個類有 成員向量,那麼是否需要深拷貝(運算符=重載)呢? ?

僅當它實際上是指向矢量的指針(如果該指針是擁有指針的話)。

這實際上從來就不是這種情況。

我假設你真的在談論一個正常的非指針成員變量反正:

class Example 
{ 
// ... 
    std::vector<int> v; 
}; 

在這種情況下,你不必在所有處理指針。 std::vector自動管理一切。