用C++完成數學中向量的封裝,其中,用指標和動態申請支援向量長度的改變,使用淺克隆和深克隆複製向量類,比較這兩種克隆方式的異同。
實驗要求:
1.畫出對應的類圖;
2.提交原始碼(用C++完成);
3.注意程式設計規範。
1、類圖
2、原始碼
(1) 淺克隆
#include <iostream>
using namespace std;
//向量類
class Vector{
private:
int *p;
int len;
public:
Vector(int len);
Vector(const Vector &vector); //複製建構函式
~Vector();
int operator[](int i) const { return p[i]; }
int &operator[](int i){ return p[i]; }
int length() const { return len; }
};
Vector::Vector(int len): len(len){
p = (int*)calloc( len, sizeof(int) );
}
//複製建構函式
Vector::Vector(const Vector &vector){
this->len = vector.len;
this->p = vector.p;
}
Vector::~Vector(){ free(p); }
//列印
void display(const Vector &vector){
int len = vector.length();
for(int i=0; i<len; i++){
if(i == len-1){
cout<<vector[i]<<endl;
}else{
cout<<vector[i]<<", ";
}
}
}
int main(){
Vector v1(10);
for(int i=0; i<10; i++){
v1[i] = i;
}
Vector v2 = v1;
v2[6] = 55;
v2[2] = 20;
cout<<"淺克隆:"<<endl;
cout<<"更改copyVector後vector的資料:"<<endl;
display(v1);
cout<<"更改copyVector後copyVector的資料:"<<endl;
display(v2);
return 0;
}
(2) 深克隆
#include <iostream>
using namespace std;
//向量類
class Vector{
private:
int *p;
int len;
public:
Vector(int len);
Vector(const Vector &vector); //複製建構函式
~Vector();
int operator[](int i) const { return p[i]; }
int &operator[](int i){ return p[i]; }
int length() const { return len; }
};
Vector::Vector(int len): len(len){
p = (int*)calloc( len, sizeof(int) );
}
//複製建構函式
Vector::Vector(const Vector &vector){
this->len = vector.len;
this->p = (int*)calloc( this->len, sizeof(int) );
memcpy( this->p, vector.p, len * sizeof(int) );
}
Vector::~Vector(){ free(p); }
//列印
void display(const Vector &vector){
int len = vector.length();
for(int i=0; i<len; i++){
if(i == len-1){
cout<<vector[i]<<endl;
}else{
cout<<vector[i]<<", ";
}
}
}
int main(){
Vector v1(10);
for(int i=0; i<10; i++){
v1[i] = i;
}
Vector v2 = v1;
v2[6] = 55;
v2[2] = 20;
cout<<"深克隆:"<<endl;
cout<<"更改copyVector後vector的資料:"<<endl;
display(v1);
cout<<"更改copyVector後copyVector的資料:"<<endl;
display(v2);
return 0;
}
3、兩種克隆方式的異同
(1)在C++中,對一個已知物件進行複製,系統會自動呼叫一種建構函式——複製建構函式。
(2)如果使用者未定義複製建構函式,則會呼叫預設複製建構函式,這時進行的是淺複製(淺克隆)。即對vector複製後出現兩個指標指向同一個記憶體空間。所以在程式中我們改變copyVector的內容,vector中的內容也會改變。
(3)若我們自己定義複製建構函式,使複製後的物件指標有自己的記憶體空間,即進行深複製(深克隆)。此時改變copyVector的內容,vector中的內容不會改變。