2012-02-20 386 views
2

我有類C++默認的複製和賦值運算符

class Circle : public isCircle{ 
    private : 
    int x; 
    int y; 
    vector<Circle*> _neighbors; 
} 

其中isCircle只是一個接口(虛擬方法),並_neighbors圈子包含指向此實例未被分配。 我的問題是,如果在這種情況下默認的複製和賦值操作符會基本上做一個深層複製?

+7

指針的深度複製是,但不是指針指向的指針。 – ildjarn 2012-02-20 20:33:33

+0

並且不要在前面使用帶「_」的名字。 – 2012-02-20 20:36:55

+5

@DmitryKachko爲什麼不呢? – 2012-02-20 20:37:26

回答

0

默認生成的拷貝構造函數和賦值操作符做淺拷貝。

如果您在這些類的實例之間共享指針,我建議您不要使用指針向量,而是使用智能指針向量。

9

C++類型的默認複製構造函數通過調用實例中每個字段上的複製構造函數以及正在創建副本的對象中的對應字段。在你的例子中,它大致翻譯爲

Circle(const Circle& other) : 
    x(other.x), 
    y(other.y), 
    _neighobrs(other._neighbors) { 

} 

副本是否很深是每個字段的拷貝構造函數的實現細節。在這種情況下,vector<T>的複製構造函數有點混合。它將深度複製底層存儲,使每個vector<T>擁有自己的獨立陣列。但是它會使用複製構造函數複製元素。在這種情況下,它是一種指針類型,因此它們以淺的方式被複制。