[英]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.