C 使用組合物件時拷貝建構函式的定義

2021-09-01 09:09:35 字數 4581 閱讀 9301

c++中拷貝建構函式的深拷貝和淺拷貝是乙個很重要的問題,在使用組合時,我們應該自定義拷貝建構函式,實現深拷貝。下面是乙個實現組合物件的深拷貝的例子。

讀取"score.txt",將其中的人名全部進行加密處理,並計算平均分,最後寫入另乙個檔案scored.txt;

例如:姓名,年齡,成績 姓名,年齡,成績

abc, 19, 80 -----> bcd, 19, 80

bcd, 18, 90 cde, 18, 90

cde, 20, 87 def, 20, 87

def, 18, 90 efg, 18, 90

最高分姓名:cde, efg

最高分:90

平均分:88

要求:1.用純c++語法實現,原檔案不得做更改;

2.體現封裝的思想,並進行類的巢狀;

3.必須使用無參建構函式、含參建構函式、拷貝建構函式;

4.實現中需體現出深拷貝的必要性;

5.需使用靜態成員變數和靜態成員函式。

stuattr.h

#ifndef stuattr

#define stuattr

#include

using namespace std;

/*宣告學生的屬性類

將age和score作為學生的屬性封裝進attribute類中

*/class stuattr

;#endif

student.h

#ifndef student

#define student

#include

#include

"stuattr.h"

using namespace std;

/*宣告學生類

*/class student

;#endif

stuattr.cpp

#include

"stuattr.h"

stuattr:

:stuattr()

stuattr::~

stuattr()

stuattr:

:stuattr

(int a,

int s)

stuattr:

:stuattr

(const stuattr &a)

void stuattr:

:setattr

(int a,

int s)

void stuattr:

:print()

int stuattr:

:getscore()

int stuattr:

:getage()

student.cpp

#include

"student.h"

student:

:student()

student::~

student()

student:

:student

(string n,

int a,

int s)

student:

:student

(string n, stuattr &a)

student:

:student

(const student &stu)

student& student:

:operator=

(const student &stu)

void student:

:setattr

(string n,

int a,

int s)

int student:

:getscore()

int student:

:getage()

string student:

:getname()

void student:

:print()

void student:

:encodenmae()

else

i++;}

}//定義時不需要再加static關鍵字

string student:

:getclassroom()

main.cpp

#include

#include

#include

"student.h"

#include

"stuattr.h"

const

int len =10;

//按照指定的字串分割字串

void

splitstring

(const string& s, vector

& v,

const string& c)

if(pos1 != s.

length()

) v.

push_back

(s.substr

(pos1));

}/*讀取檔案頭放在head中,讀取檔案內容放在pstus中*/

intreadfile

(char

* filename, student pstus[

], string & head )

//首先讀取檔案頭

string line;

//cout << line << endl;

getline

(in, line)

; head = line;

int n =0;

while

(getline

(in, line)

&& n < len)

else

if(n ==1)

else

if(n ==2)

else

/* pstus[n].name = strvect[0];

pstus[n].age = atoi((char *)strvect[1].c_str()); //將string型別的age轉化成char*型別,再轉換成int

pstus[n].socre = score;

*/n++;}

in.close()

;return n;

}/*將結果寫入檔案*/

void

writefile

(char

* filename, student pstus[

], string & head, vector names,

int max,

int mean,

int num)

out <<

"最高分姓名:"

; cout <<

"最高分姓名:"

;for

(int i =

0; i < names.

size()

; i++

) out << endl;

cout << endl;

out <<

"最高分:"

<< max << endl;

cout <<

"最高分:"

<< max << endl;

out <<

"平均分:"

<< mean << endl;

cout <<

"平均分:"

<< mean << endl;

out.

close()

;}/*顯示student陣列*/

void

print

(student ps,

const

int num)

}/*對名字進行加密*/

void

encryption

(student ps,

const

int num)

}/*獲取最高分數和平均分數*/

void

getmaxmean

(student ps,

const

int num,

int&maxscore,

int&mean)

} mean = sum / num;

}/*獲取取得最高分數的姓名*/

vector

getname

(student ps,

const

int num,

int maxscore)

}return names;

}string student:

:classroom =

"1班"

;//使用類名直接引用公有靜態成員,只能寫在main函式外面

C 類物件的拷貝建構函式

c 類物件的拷貝建構函式 不祥 閱讀人次 條 對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std cl...

C 類物件的深拷貝 淺拷貝建構函式

在學習這一章內容前我們已經學習過了類的建構函式和析構函式的相關知識,對於普通型別的物件來說,他們之間的複製是很簡單的,例如 自己定義的類的物件同樣是物件,誰也不能阻止我們用以下的方式進行複製,例如 普通物件和類物件同為物件,他們之間的特性有相似之處也有不同之處,類物件內部存在成員變數,而普通物件是沒...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...