版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第五章 構(gòu)造和析構(gòu)函數(shù) 構(gòu)造和析構(gòu)函數(shù)classStudent{public:Student();//構(gòu)造函數(shù)的聲明;系統(tǒng)約定與類同名,自動調(diào)用,沒有返回值,可以重載~Student();//析構(gòu)函數(shù)的聲明;沒有參數(shù),沒有返回值,不可以重載;對象生命期結(jié)束時由系統(tǒng)自動調(diào)用protected: char*name;intage;};Student::Student(){cout<<"構(gòu)造"<<endl;age=5;}Student::~Student(){cout<<“析構(gòu),對象結(jié)束了"<<endl;}intmain(){ Studenta;Studentb;return0;}析構(gòu)函數(shù)的調(diào)用順序和對象構(gòu)造的順序相反析構(gòu)函數(shù)不是刪除對象,而是在撤銷對象占用的內(nèi)存之前完成一些清理工作。還可以用來執(zhí)行用戶希望在對象生命期結(jié)束時所執(zhí)行的任何操作。2
C++標(biāo)準(zhǔn)庫--stringstringname;自動處理空間的占用問題??梢杂?進(jìn)行賦值操作,==進(jìn)行比較,+做串聯(lián).使用時#include<string>
stringstr1,str2=“abcd”;
str1=str2;
str2=str1+”123”;
cout<<str2<<""<<str2.length();由C++字符串得到對應(yīng)的C_string的方法是使用data()、c_str()chars[20];strcpy(s,str1.data());strcpy(s,str2.c_str()); 帶參數(shù)的構(gòu)造函數(shù)
classStudent{ public:
Student(stringpName,inti,floatj){
cout<<"構(gòu)造學(xué)生"<<pName<<endl;
name=pName;
semesHours=i;
gpa=j;
}
~Student()
{cout<<"析構(gòu)"<<name<<endl;} private:
stringname;intsemesHours;floatgpa;
};
voidf(){Studentt("Tom",17,90);}
intmain(){
Studentss("Jenny",20,80.5);
f();
return0;
} 構(gòu)造和析構(gòu)函數(shù)classA{public: ints;};Aa1;對于沒有顯性構(gòu)造函數(shù)的類系統(tǒng)都自動提供一個默認(rèn)構(gòu)造函數(shù)
A(){}用戶沒有定義析構(gòu)函數(shù),編譯器自動生成一個析構(gòu)函數(shù)。
~A(){} 構(gòu)造函數(shù)重載classStudent{
public:
Student(stringpName){
cout<<"姓名"<<pName<<endl;
name=pName;
}
Student(stringpName,inti){
cout<<“姓名學(xué)時"<<endl;
name=pName;
semesHours=i;
}
Student(){}//自定義無參構(gòu)造函數(shù)將替代缺省構(gòu)造函數(shù)的存在
private:
stringname;intsemesHours;
};
intmain(){
Studenttt("Tom",60);Studentss("Jenny");
Studentf;
return0;
}如果手工定義了任何的構(gòu)造函數(shù),系統(tǒng)不再提供默認(rèn)的無參構(gòu)造函數(shù)。 默認(rèn)值構(gòu)造函數(shù)classStudent{public:
Student(stringpName=“”,inti=0){
cout<<“姓名學(xué)時"<<endl;
name=pName;
semesHours=i;
}protected:
stringname;intsemesHours;};intmain(){
Studenttt("Tom",60);Studentss("Jenny");
Studentf;//不錯誤return0;}無名對象(一次性對象):Student("Jane");一般作為實參,用在創(chuàng)建后不需要反復(fù)使用的場合 構(gòu)造函數(shù)構(gòu)造函數(shù)是特殊的類成員函數(shù)。C++規(guī)定與類同名的成員函數(shù)是構(gòu)造函數(shù),在該類的對象創(chuàng)建時,自動被調(diào)用。構(gòu)造函數(shù)負(fù)責(zé)對象的初始化可擁有多個參數(shù)??梢灾剌d。構(gòu)造函數(shù)不返回具體的值,不指定函數(shù)的返回類型。可內(nèi)置定義,也可以在類外定義。通常是Public的 析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個特殊的成員函數(shù);作用與構(gòu)造函數(shù)相反;在對象的生命期結(jié)束時自動被調(diào)用。名字是類名前加一個~;不返回任何值;沒有函數(shù)類型,沒有函數(shù)參數(shù),因此不能被重載。一個類可以由多個構(gòu)造函數(shù),只能有一個析構(gòu)函數(shù)??蓛?nèi)置定義,也可以在類外定義。用于清理和釋放資源的工作。通常是Public的 練習(xí)題判斷對錯,錯誤寫出原因:1、使用struct定義的類中默認(rèn)的訪問權(quán)限是private的2、this不能被非成員函數(shù)訪問3、任何情況下private權(quán)限的內(nèi)容不能被類外訪問4、引用破壞了函數(shù)的封裝性5、內(nèi)聯(lián)函數(shù)的作用是提高系統(tǒng)的效率6、不同類的成員函數(shù)也可以重載7、參數(shù)類型、函數(shù)返回類型可以作為函數(shù)重載的依據(jù) 組合類組合:是指結(jié)構(gòu)和類的聲明嵌入結(jié)構(gòu)變量和對象作為其成員的現(xiàn)象嵌入的對象成員稱為成員對象(類成員)包容這個成員對象的類稱為組合類 組合類創(chuàng)建classStudent{public:
Student(){
cout<<"constructingstudent.\n";
semesHours=100;}~Student(){cout<<“~Student\n”;}protected:
intsemesHours;};classTeacher{public:
Teacher(){cout<<"constructingteacher.\n";}
~Teacher(){cout<<“~Teacher\n”;}private:
charname[20];};classTutorPair{public:
TutorPair(){
cout<<"constructingtutorpair.\n";
noMeetings=0;
}
~TutorPair(){cout<<“~TutorPair\n”;}protected:
Studentstudent;
Teacherteacher;
intnoMeetings;};intmain(){
TutorPairtp;
cout<<"backinmain.\n";return0;} 組合類對象的初始化困惑classStudentID{public:
StudentID(intid=0){
value=id;
}
~StudentID(){}protected:
intvalue;};classStudent{public:
Student(stringpName="noName",intssID=0){name=pName;
}private:
stringname;
StudentIDid;};intmain(){
Students("Randy",9818);
return0;} 組合類的構(gòu)造函數(shù)classStudentID{public:
StudentID(intid=0){
value=id;
}
~StudentID(){}protected:
intvalue;};classStudent{public:
Student(stringpName="noName",intssID=0):id(ssID){name=pName;
}private:
stringname;
StudentIDid;};intmain(){
Students("Randy",9818);
return0;}冒號語法:用冒號引出構(gòu)造函數(shù)的調(diào)用表(初始化列表),用構(gòu)造參數(shù)列表中說明的參數(shù)去調(diào)用構(gòu)造函數(shù) 例子classStudent{public:
Student(inti){
cout<<"constructingstudent.\n";
semesHours=i;}~Student(){cout<<“~Student\n”;}protected:
intsemesHours;};classTeacher{public:
Teacher(stringp){
cout<<"constructingteacher.\n"; name=p; }
~Teacher(){cout<<“~Teacher\n”;}private: stringname;};classTutorPair{public:
TutorPair(inti,intj,stringp): teacher(p),student(j){
cout<<"constructingtutorpair.\n";
noMeetings=i;
}
~TutorPair(){cout<<“~TutorPair\n”;}protected:
Studentstudent;
Teacherteacher;
intnoMeetings;};intmain(){
TutorPairtp(5,20,"Tim");
cout<<"backinmain.\n";return0;} 構(gòu)造函數(shù)初始化常數(shù)據(jù)成員和引用成員 classStudent{public:
Student(ints,int&k):i(s),j(k)
{}//不可以直接賦值
voidp(){cout<<j<<endl;}protected:
constinti;
int&j;};intmain(){
intc=123;
Students(9818,c);
s.p();
return0;} 對象構(gòu)造順序局部和靜態(tài)局部對象(文件作用域)以文本定義順序為順序,(類成員屬于此種情況)靜態(tài)對象在首次定義時構(gòu)造一次;程序結(jié)束析構(gòu)全局對象在main之前構(gòu)造;程序結(jié)束時析構(gòu)全局對象如果分布在不同文件中,則構(gòu)造順序隨機(jī) 例子classA{public: A(intk){s=k;cout<<k<<"Aisconstructing\n";}; ~A(){cout<<s<<"~A\n";} ints;};intmain(){
cout<<"mainisrunning\n";
As(1);voidf();f();f();
return0;}voidf(){
cout<<"fisrunning\n";
As(2);
staticAt(3);}At(4); 練習(xí)重寫Rectangle,將坐標(biāo)抽象為Point類,通過冒號語法對Rectangle中的Point類進(jìn)行初始化 為對象申請動態(tài)空間Malloc和對應(yīng)的free函數(shù)不能調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),這破壞了:空間分配、初始化的功能。所以引入了new和delete。因為空間不確定才使用堆空間函數(shù)內(nèi)部的申請空間要及時釋放,否則容易造成內(nèi)存泄漏 malloc\newclassaa{public:aa(inta=1){id=a;cout<<"構(gòu)造"<<endl;}intid;~aa(){cout<<“aais析構(gòu).”<<endl;}};intmain(){
aa*p=newaa(9);
cout<<p->id;
aa*q=(aa*)malloc(sizeof(aa));
cout<<q->id;//隨機(jī)數(shù),表明構(gòu)造函數(shù)未調(diào)用
deletep;
free(q);//析構(gòu)函數(shù)未調(diào)用
return0;} 例子classaa{public:aa(inta=1){id=a;}intid;};aa&m(){
aa*p=newaa(9);
return(*p);}intmain(){
aa&s=m();
cout<<s.id;//結(jié)果為9表明沒有釋放
return0;} 例子classaa{public:aa(inta=1){id=a;}intid;};aa&m(){
aa*p=newaa(9);
deletep;//釋放后不應(yīng)該再返回
return(*p);}intmain(){
aa&s=m();
cout<<s.id;//結(jié)果為隨機(jī)數(shù)表明被釋放
return0;} 析構(gòu)函數(shù)的需要性classaa{public:aa(inta=9){age=newint[a];}
~aa(){delete[]age;}
int*age;};intmain(){
aa*s=newaa;
s->age[0]=20;
int*t=s->age;
deletes;
cout<<t[0];
return0;} 對象數(shù)組classStudent{public:
Student(){cin>>value;}
~Student(){cout<<value<<endl;}protected:
intvalue;};intmain(){
Student*p=newStudent[5];
cout<<“DeleteBegin”<<endl;
delete[]p;
return0;}對象數(shù)組不能通過參數(shù)傳遞初始化。要么默認(rèn)構(gòu)造函數(shù),要么構(gòu)造函數(shù)有默認(rèn)參數(shù)Studenta[10](20);//錯誤
建立動態(tài)數(shù)組intnextStudentID=1;classStudentID{public:StudentID(){ value=nextStudentID++;}~StudentID(){--nextStudentID;}protected:intvalue;};classStudent{public:Student(stringpName="noName"){name=pName;}protected:stringname;StudentIDid;};intmain(){ inti,
j; stringtemp; cin>>i; Student**p=newStudent*[
i
]; for(j=0;j<i;j++){ cin>>temp; p[j]=newStudent(temp); cout<<nextStudentID;
}
for(j=i-1;j>=0;j--)
deletep[j]; delete[]p; cout<<nextStudentID;
return0;} 例子
inti;inta[i];//error
inti;
cin>>i;
int*p=newint[i];delete[]p; 對象的賦值classStudent{ stringname;intsemesHours;public: Student(stringpName=“”,inti=0){
name=pName;semesHours=I;
}};Studenta("jenny",50);Studentb;b=a;一個已知對象賦值給另一個已知對象,通過對賦值運算符的重載實現(xiàn)的
Student&operator=(constStudent&rValue){
name=rV;
semesHours=rValue.semesHours;
return*this;} 對象的拷貝用一個已知對象構(gòu)造(初始化)一個新對象。 Students1(“Jenny”);
Students2=s1;即Students2(s1);
Studentfn(Students){Studentk;//.......;returnk}//window下 intmain(){ Studentm,n;
n=fn(m);return0; }拷貝構(gòu)造函數(shù)
Student(constStudent&s){
name=;semesHours=s.semesHours;
}
例子-練習(xí),調(diào)用哪個函數(shù)classStudent{public: Student(intk):i(k){}
Student(){} voidp(){cout<<i<<endl;}protected: inti;};intmain(){
Students(9818);
s.p(); Studentt(s); t.p();
Studentm;
m=t;
m.p();
return0;} 重寫拷貝構(gòu)造函數(shù)classStudent{public: Student(intk):i(k){}
Student(){} voidp(){cout<<i<<endl;}
Student(Studentconst&m){i=m.i*(-1);}//重寫拷貝構(gòu)造函數(shù)protected: inti;};intmain(){
Students(9818);s.p();Studentt(s);t.p(); Studentk=s;k.p(); Student*p=newStudent(s); p->p(); Studentm;m=s; m.p();return0;} 淺拷貝classaa{public:aa(){ f=newchar[10]; }~aa(){delete[]f;}char*f;};intmain(){ aap; strcpy(p.f,"Computer"); cout<<p.f<<endl; aaq(p);//aaq=p; cout<<q.f<<endl; strcpy(p.f,"Software"); cout<<q.f<<p.f<<endl;
return0;}創(chuàng)建q時,對象p被復(fù)制給了q,但資源未復(fù)制,使得p和q指向同一個資源,這稱為淺拷貝同一個指針執(zhí)行兩遍delete操作,會發(fā)生什么?災(zāi)難,可能會破壞該堆及自由內(nèi)存表 深拷貝classaa{public: aa(){f=newchar[10];} aa(aaconst&s){
f=newchar[10];strcpy(f,s.f);} ~aa(){delete[]f;} char*f;};intmain(){ aap; strcpy(p.f,"Computer"); cout<<p.f<<endl; aaq(p); cout<<q.f<<endl; strcpy(p.f,”Software”); cout<<p.f<<q.f<<endl; return0;} 例子-練習(xí)classStudent{public: Student(inti){value=i;cout<<"Student"<<value<<endl;} ~Student(){cout<<"~Student"<<value<<endl;}protected: intvalue;};intmain(){ Student(9); Student*p=&Student(8); Student&q=Student(7); Studenti(6); i=Student(5);
return0;} 類型轉(zhuǎn)換classaa{public:aa(inta=1){id=a;cout<<"構(gòu)造"<<endl;}aa(constaa&s){id=s.id;cout<<"拷貝"<<endl;}int&Getid(){return(id);}private:intid;};intmain(){ aam;//“構(gòu)造” aan(m);//“拷貝” aao=m;//“拷貝”和aao(m)等價
aas=9;//“構(gòu)造”和aas(9)等價 aat;//“構(gòu)造”
t=9;//“構(gòu)造”、賦值運算
return0;} 類型轉(zhuǎn)換classaa{public:aa(inta=1){id=a;}char*p;intid;};voidm(aaa){cout<<a.id<<endl;}intmain(){m(9);//相當(dāng)于m(aa(9));return0;}如果存在m(int)的函數(shù)則優(yōu)先匹配 類型轉(zhuǎn)換classaa{public:aa(inta=1){id=a;}intid;};classbb{public:bb(inta=2){id=a;}intid;};voidm(aaa){cout<<a.id<<endl;}voidm(bba){cout<<a.id<<endl;}intmain(){
m(9);//存在二義性;
return0;} 類型轉(zhuǎn)換classHighWorker{floatincome;public:HighWorker(floata=2000.0){income=a;}floatGetincome(){return(income);}};classWorker{floatincome;public:Worker(fl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版特許經(jīng)營權(quán)授予協(xié)議
- 買賣協(xié)議書匯編六篇
- 2024年度砸墻工程設(shè)計與施工監(jiān)理合同3篇
- 2024年生產(chǎn)協(xié)作合同3篇
- 2024年版食堂廚房管理服務(wù)合同3篇
- 活動計劃模板集錦五篇
- 大學(xué)生學(xué)習(xí)計劃15篇
- 收購合同匯編10篇
- 對甲氧基苯甲醛項目商業(yè)計劃書
- 學(xué)校后勤干事崗位職責(zé)總結(jié)
- 【9物(人)期末】安慶市宿松縣2023-2024學(xué)年九年級上學(xué)期期末考試物理試題
- 導(dǎo)航通信一體化考核試卷
- 2024年未成年子女房產(chǎn)贈與協(xié)議
- 2024-2030年中國共模電感環(huán)形鐵芯行業(yè)發(fā)展?fàn)顩r規(guī)劃分析報告
- 眼視光學(xué)理論和方法知到智慧樹章節(jié)測試課后答案2024年秋山東中醫(yī)藥大學(xué)
- 叉車維護(hù)維修合同
- 2024年財務(wù)部年度工作總結(jié)(7篇)
- 2024年度醫(yī)療美容服務(wù)合作合同3篇
- 水利工程勞務(wù)施工方案
- 山東省德州市2023-2024學(xué)年高二上學(xué)期期末考試政治試題 附答案
- 高中體育教學(xué)教案30篇
評論
0/150
提交評論