2024.10.29(週二)

记得关月亮發表於2024-11-04

用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中的內容不會改變。