簡體   English   中英

C ++陣列深度復制構造函數

[英]C++ Array Deep Copy Constructor

來自復制數組的“編程:使用C ++的原理和實踐-Bjarne Stroustrup”示例:

18.3.1復制構造函數

class vector {
    int sz; // the size
    double* elem; // a pointer to the elements
public:
    vector(int s) :
            sz { s }, elem { new double[s] } {
        for (int i = 0; i < sz; ++i)
            elem[i] = 0.0; // initialize
    } // constructor
    ~vector() {
        delete[] elem;
    } // destructor
    int size() const {
        return sz;
    } // the current size
    double get(int n) const {
        return elem[n];
    } // access: read
    void set(int n, double v) {
        elem[n] = v;
    } // access: write
    vector(const vector& arg)
// allocate elements, then initialize them by copying
    :
            sz { arg.sz }, elem { new double[arg.sz] } {
        copy(arg.elem, arg.elem + arg.sz, elem); // std::copy(); see §B.5.2
    }
};
int main(int argc, char ** argv) {
    vector v(3); // define a vector of 3 elements
    v.set(2, 2.2); // set v[2] to 2.2
    vector v2 = v;
    v.set(1, 99); // set v[1] to 99
    v2.set(0, 88); // set v2[0] to
    cout << v.get(0) << ' ' << v2.get(1);
    return 0;
}

為什么要復制實際的數組成員而不是僅復制其地址? elem是一個指針,在復制命令中未取消引用。

您的困惑源自值類型引用類型之間的區別。

在標准C ++慣例中,除非另有說明,否則一切都是值類型 除非另有明確說明,否則對象的副本是完全不同的。

這就是為什么更改向量的副本時, 無論向量的內部功能如何運行,都不得更改其復制來源的原始向量。

向量是在內部使用動態分配的內存實現的,這是一個實現細節,與向量本身的接口無關,該接口將自身表示為值類型(默認情況下)

要回答關於為什么要復制數組成員而不是僅復制其地址的問題。 解釋淺表副本和深表副本之間的區別可能會有所幫助。 假設我們有兩個指向兩個不同數組A和B的指針。

A = [0, 1, 2, 3, 4] 
B = [9, 10, 11, 12, 13] 

讓我們將A的內容復制到B。淺表復制將只涉及更改指針。 B = A

這並不總是理想的,因為您在A中更改的任何元素也會在B中更改,因為它們指向內存中的相同位置。

如果執行深度復制,則將所有元素從A復制到B。

A = [0, 1, 2, 3, 4] 
B = [0, 1, 2, 3, 4]

如果更改A中的項目,則不會影響B中的項目。即,更改

A[0] = 10

然后,

A = [10, 1, 2, 3, 4] 
B = [0, 1, 2, 3, 4]

希望對您有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM