版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章 構(gòu)造和析構(gòu)函數(shù) 構(gòu)造和析構(gòu)函數(shù)classStudent{public:Student();//構(gòu)造函數(shù)的聲明;系統(tǒng)約定與類同名,自動(dòng)調(diào)用,沒(méi)有返回值,可以重載~Student();//析構(gòu)函數(shù)的聲明;沒(méi)有參數(shù),沒(méi)有返回值,不可以重載;對(duì)象生命期結(jié)束時(shí)由系統(tǒng)自動(dòng)調(diào)用protected: char*name;intage;};Student::Student(){cout<<"構(gòu)造"<<endl;age=5;}Student::~Student(){cout<<“析構(gòu),對(duì)象結(jié)束了"<<endl;}intmain(){ Studenta;Studentb;return0;}析構(gòu)函數(shù)的調(diào)用順序和對(duì)象構(gòu)造的順序相反析構(gòu)函數(shù)不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作。還可以用來(lái)執(zhí)行用戶希望在對(duì)象生命期結(jié)束時(shí)所執(zhí)行的任何操作。2
C++標(biāo)準(zhǔn)庫(kù)--stringstringname;自動(dòng)處理空間的占用問(wèn)題。可以用=進(jìn)行賦值操作,==進(jìn)行比較,+做串聯(lián).使用時(shí)#include<string>
stringstr1,str2=“abcd”;
str1=str2;
str2=str1+”123”;
cout<<str2<<""<<str2.length();由C++字符串得到對(duì)應(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;對(duì)于沒(méi)有顯性構(gòu)造函數(shù)的類系統(tǒng)都自動(dòng)提供一個(gè)默認(rèn)構(gòu)造函數(shù)
A(){}用戶沒(méi)有定義析構(gòu)函數(shù),編譯器自動(dòng)生成一個(gè)析構(gòu)函數(shù)。
~A(){} 構(gòu)造函數(shù)重載classStudent{
public:
Student(stringpName){
cout<<"姓名"<<pName<<endl;
name=pName;
}
Student(stringpName,inti){
cout<<“姓名學(xué)時(shí)"<<endl;
name=pName;
semesHours=i;
}
Student(){}//自定義無(wú)參構(gòu)造函數(shù)將替代缺省構(gòu)造函數(shù)的存在
private:
stringname;intsemesHours;
};
intmain(){
Studenttt("Tom",60);Studentss("Jenny");
Studentf;
return0;
}如果手工定義了任何的構(gòu)造函數(shù),系統(tǒng)不再提供默認(rèn)的無(wú)參構(gòu)造函數(shù)。 默認(rèn)值構(gòu)造函數(shù)classStudent{public:
Student(stringpName=“”,inti=0){
cout<<“姓名學(xué)時(shí)"<<endl;
name=pName;
semesHours=i;
}protected:
stringname;intsemesHours;};intmain(){
Studenttt("Tom",60);Studentss("Jenny");
Studentf;//不錯(cuò)誤return0;}無(wú)名對(duì)象(一次性對(duì)象):Student("Jane");一般作為實(shí)參,用在創(chuàng)建后不需要反復(fù)使用的場(chǎng)合 構(gòu)造函數(shù)構(gòu)造函數(shù)是特殊的類成員函數(shù)。C++規(guī)定與類同名的成員函數(shù)是構(gòu)造函數(shù),在該類的對(duì)象創(chuàng)建時(shí),自動(dòng)被調(diào)用。構(gòu)造函數(shù)負(fù)責(zé)對(duì)象的初始化可擁有多個(gè)參數(shù)。可以重載。構(gòu)造函數(shù)不返回具體的值,不指定函數(shù)的返回類型??蓛?nèi)置定義,也可以在類外定義。通常是Public的 析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù);作用與構(gòu)造函數(shù)相反;在對(duì)象的生命期結(jié)束時(shí)自動(dòng)被調(diào)用。名字是類名前加一個(gè)~;不返回任何值;沒(méi)有函數(shù)類型,沒(méi)有函數(shù)參數(shù),因此不能被重載。一個(gè)類可以由多個(gè)構(gòu)造函數(shù),只能有一個(gè)析構(gòu)函數(shù)。可內(nèi)置定義,也可以在類外定義。用于清理和釋放資源的工作。通常是Public的 練習(xí)題判斷對(duì)錯(cuò),錯(cuò)誤寫出原因:1、使用struct定義的類中默認(rèn)的訪問(wèn)權(quán)限是private的2、this不能被非成員函數(shù)訪問(wèn)3、任何情況下private權(quán)限的內(nèi)容不能被類外訪問(wèn)4、引用破壞了函數(shù)的封裝性5、內(nèi)聯(lián)函數(shù)的作用是提高系統(tǒng)的效率6、不同類的成員函數(shù)也可以重載7、參數(shù)類型、函數(shù)返回類型可以作為函數(shù)重載的依據(jù) 組合類組合:是指結(jié)構(gòu)和類的聲明嵌入結(jié)構(gòu)變量和對(duì)象作為其成員的現(xiàn)象嵌入的對(duì)象成員稱為成員對(duì)象(類成員)包容這個(gè)成員對(duì)象的類稱為組合類 組合類創(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;} 組合類對(duì)象的初始化困惑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;}冒號(hào)語(yǔ)法:用冒號(hào)引出構(gòu)造函數(shù)的調(diào)用表(初始化列表),用構(gòu)造參數(shù)列表中說(shuō)明的參數(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;} 對(duì)象構(gòu)造順序局部和靜態(tài)局部對(duì)象(文件作用域)以文本定義順序?yàn)轫樞颍惓蓡T屬于此種情況)靜態(tài)對(duì)象在首次定義時(shí)構(gòu)造一次;程序結(jié)束析構(gòu)全局對(duì)象在main之前構(gòu)造;程序結(jié)束時(shí)析構(gòu)全局對(duì)象如果分布在不同文件中,則構(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類,通過(guò)冒號(hào)語(yǔ)法對(duì)Rectangle中的Point類進(jìn)行初始化 為對(duì)象申請(qǐng)動(dòng)態(tài)空間Malloc和對(duì)應(yīng)的free函數(shù)不能調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),這破壞了:空間分配、初始化的功能。所以引入了new和delete。因?yàn)榭臻g不確定才使用堆空間函數(shù)內(nèi)部的申請(qǐng)空間要及時(shí)釋放,否則容易造成內(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表明沒(méi)有釋放
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;} 對(duì)象數(shù)組classStudent{public:
Student(){cin>>value;}
~Student(){cout<<value<<endl;}protected:
intvalue;};intmain(){
Student*p=newStudent[5];
cout<<“DeleteBegin”<<endl;
delete[]p;
return0;}對(duì)象數(shù)組不能通過(guò)參數(shù)傳遞初始化。要么默認(rèn)構(gòu)造函數(shù),要么構(gòu)造函數(shù)有默認(rèn)參數(shù)Studenta[10](20);//錯(cuò)誤
建立動(dòng)態(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; 對(duì)象的賦值classStudent{ stringname;intsemesHours;public: Student(stringpName=“”,inti=0){
name=pName;semesHours=I;
}};Studenta("jenny",50);Studentb;b=a;一個(gè)已知對(duì)象賦值給另一個(gè)已知對(duì)象,通過(guò)對(duì)賦值運(yùn)算符的重載實(shí)現(xiàn)的
Student&operator=(constStudent&rValue){
name=rV;
semesHours=rValue.semesHours;
return*this;} 對(duì)象的拷貝用一個(gè)已知對(duì)象構(gòu)造(初始化)一個(gè)新對(duì)象。 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)用哪個(gè)函數(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時(shí),對(duì)象p被復(fù)制給了q,但資源未復(fù)制,使得p和q指向同一個(gè)資源,這稱為淺拷貝同一個(gè)指針執(zhí)行兩遍delete操作,會(huì)發(fā)生什么?災(zāi)難,可能會(huì)破壞該堆及自由內(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)等價(jià)
aas=9;//“構(gòu)造”和aas(9)等價(jià) aat;//“構(gòu)造”
t=9;//“構(gòu)造”、賦值運(yùn)算
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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)威士忌市場(chǎng)銷售渠道與營(yíng)銷趨勢(shì)預(yù)測(cè)報(bào)告
- 2024年獨(dú)家:影視作品版權(quán)許可使用協(xié)議
- 2024年特許經(jīng)營(yíng)合同實(shí)務(wù)操作
- 2024年版企業(yè)間技術(shù)咨詢合同
- 茅臺(tái)學(xué)院《公共關(guān)系案例精講》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年智能監(jiān)控系統(tǒng)設(shè)備安裝協(xié)議版B版
- 2024年度內(nèi)河化學(xué)品運(yùn)輸安全責(zé)任合同模板下載3篇
- 2024年生態(tài)農(nóng)業(yè)自建房產(chǎn)權(quán)轉(zhuǎn)移協(xié)議3篇
- 2025廢品回收合同
- 2024年標(biāo)準(zhǔn)電腦維修服務(wù)承諾合同范本版B版
- 2023年正規(guī)借條免費(fèi)下載(5篇)
- 網(wǎng)絡(luò)創(chuàng)業(yè)智慧樹知到答案章節(jié)測(cè)試2023年海南經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院
- 高中英語(yǔ)新課標(biāo)新增詞匯匯總1
- GB/T 31586.2-2015防護(hù)涂料體系對(duì)鋼結(jié)構(gòu)的防腐蝕保護(hù)涂層附著力/內(nèi)聚力(破壞強(qiáng)度)的評(píng)定和驗(yàn)收準(zhǔn)則第2部分:劃格試驗(yàn)和劃叉試驗(yàn)
- GB/T 20734-2006液化天然氣汽車專用裝置安裝要求
- GB/T 20197-2006降解塑料的定義、分類、標(biāo)志和降解性能要求
- GB/T 15561-2008靜態(tài)電子軌道衡
- 軍事理論論述題
- 寧德時(shí)代財(cái)務(wù)報(bào)表分析
- 門式起重機(jī)安裝施工方案
- 高中語(yǔ)文語(yǔ)法知識(shí)課件
評(píng)論
0/150
提交評(píng)論