




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五章第五章構(gòu)造和析構(gòu)函數(shù)構(gòu)造和析構(gòu)函數(shù)構(gòu)造和析構(gòu)函數(shù)class Student public: Student(); /構(gòu)造函數(shù)的聲明;系統(tǒng)約定與類同名,自動(dòng)調(diào)用,沒有返回值,可以重載 Student(); /析構(gòu)函數(shù)的聲明;沒有參數(shù),沒有返回值,不可以重載;對(duì)象生命期結(jié)束時(shí)由系統(tǒng)自動(dòng)調(diào)用protected: char *name; int age;Student:Student() cout 構(gòu)造 endl; age=5; Student:Student() cout“析構(gòu),對(duì)象結(jié)束了 endl; int main()Student a; Student b; return 0; n析構(gòu)函
2、數(shù)的調(diào)用順序和對(duì)象構(gòu)造的順序相反n析構(gòu)函數(shù)不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作。還可以用來執(zhí)行用戶希望在對(duì)象生命期結(jié)束時(shí)所執(zhí)行的任何操作。C+標(biāo)準(zhǔn)庫(kù)-stringnstring name; n自動(dòng)處理空間的占用問題。n可以用 = 進(jìn)行賦值操作,= 進(jìn)行比較,+ 做串聯(lián).n使用時(shí)#include string str1,str2=“abcd”; str1=str2;str2=str1+”123”;coutstr2 str2.length();n由C+字符串得到對(duì)應(yīng)的C_string的方法是使用data()、c_str()nchar s20;strcpy(s,str1.dat
3、a();nstrcpy(s,str2.c_str();帶參數(shù)的構(gòu)造函數(shù)class Studentpublic:Student(string pName, int i,float j) cout 構(gòu)造學(xué)生 pName endl; name = pName; semesHours=i; gpa=j; Student() cout 析構(gòu) name endl; private: string name; int semesHours; float gpa;void f()Student t(Tom, 17, 90);int main() Student ss(Jenny, 20, 80.5); f()
4、; return 0; 構(gòu)造和析構(gòu)函數(shù)class A public: int s;A a1; n對(duì)于沒有顯性構(gòu)造函數(shù)的類系統(tǒng)都自動(dòng)提供一個(gè)默認(rèn)構(gòu)造函數(shù)A( ) n用戶沒有定義析構(gòu)函數(shù),編譯器自動(dòng)生成一個(gè)析構(gòu)函數(shù)。A() 構(gòu)造函數(shù)重載class Studentpublic: Student(string pName) cout 姓名 pName endl; name = pName; Student(string pName,int i)cout“姓名學(xué)時(shí)endl; name = pName; semesHours=i; Student()/自定義無參構(gòu)造函數(shù)將替代缺省構(gòu)造函數(shù)的存在privat
5、e: string name; int semesHours; ;int main() Student tt(Tom,60); Student ss(Jenny); Student f; return 0; n如果手工定義了任何的構(gòu)造函數(shù),系統(tǒng)不再提供默認(rèn)的無參構(gòu)造函數(shù)。 默認(rèn)值構(gòu)造函數(shù) class Studentpublic: Student(string pName=“”,int i=0) cout“姓名學(xué)時(shí)endl; name = pName; semesHours=i; protected: string name; int semesHours; ;int main() Studen
6、t tt(Tom,60); Student ss(Jenny); Student f; /不錯(cuò)誤 return 0; n無名對(duì)象(一次性對(duì)象):Student(Jane) ;一般作為實(shí)參,用在創(chuàng)建后不需要反復(fù)使用的場(chǎng)合構(gòu)造函數(shù)n構(gòu)造函數(shù)是特殊的類成員函數(shù)。nC+規(guī)定與類同名的成員函數(shù)是構(gòu)造函數(shù),在該類的對(duì)象創(chuàng)建時(shí),自動(dòng)被調(diào)用。n構(gòu)造函數(shù)負(fù)責(zé)對(duì)象的初始化n可擁有多個(gè)參數(shù)。可以重載。n構(gòu)造函數(shù)不返回具體的值,不指定函數(shù)的返回類型。n可內(nèi)置定義,也可以在類外定義。n通常是Public的析構(gòu)函數(shù)n析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù);n作用與構(gòu)造函數(shù)相反;在對(duì)象的生命期結(jié)束時(shí)自動(dòng)被調(diào)用。n名字是類名前加一個(gè)
7、;n不返回任何值;沒有函數(shù)類型,沒有函數(shù)參數(shù),因此不能被重載。n一個(gè)類可以由多個(gè)構(gòu)造函數(shù),只能有一個(gè)析構(gòu)函數(shù)。n可內(nèi)置定義,也可以在類外定義。n用于清理和釋放資源的工作。n通常是Public的練習(xí)題n判斷對(duì)錯(cuò),錯(cuò)誤寫出原因:n1、使用struct定義的類中默認(rèn)的訪問權(quán)限是private的n2、this不能被非成員函數(shù)訪問n3、任何情況下private權(quán)限的內(nèi)容不能被類外訪問n4、引用破壞了函數(shù)的封裝性n5、內(nèi)聯(lián)函數(shù)的作用是提高系統(tǒng)的效率n6、 不同類的成員函數(shù)也可以重載n7、 參數(shù)類型、函數(shù)返回類型可以作為函數(shù)重載的依據(jù)組合類n組合:是指結(jié)構(gòu)和類的聲明嵌入結(jié)構(gòu)變量和對(duì)象作為其成員的現(xiàn)象n嵌入的
8、對(duì)象成員稱為成員對(duì)象(類成員)n包容這個(gè)成員對(duì)象的類稱為組合類組合類創(chuàng)建class Studentpublic: Student() cout constructing student.n; semesHours=100; Student()cout“Studentn”;protected: int semesHours;class Teacherpublic: Teacher( ) cout constructing teacher.n; Teacher()cout“Teachern”;private: char name20; ;class TutorPairpublic: TutorPa
9、ir() cout constructing tutorpair.n;noMeetings = 0; TutorPair()cout“TutorPairn”;protected: Student student; Teacher teacher; int noMeetings; ; int main() TutorPair tp; cout back in main.n;return 0;組合類對(duì)象的初始化困惑class StudentIDpublic: StudentID(int id=0)value=id; StudentID() protected: int value;class St
10、udentpublic: Student(string pName=noName,int ssID=0) name pName; private: string name; StudentID id;int main() Student s(Randy,9818);return 0;組合類的構(gòu)造函數(shù)class StudentIDpublic: StudentID(int id=0)value=id; StudentID() protected: int value;class Studentpublic: Student(string pName=noName,int ssID=0):id(s
11、sID) name pName; private: string name; StudentID id;int main() Student s(Randy,9818);return 0;n冒號(hào)語法:用冒號(hào)引出構(gòu)造函數(shù)的調(diào)用表(初始化列表),用構(gòu)造參數(shù)列表中說明的參數(shù)去調(diào)用構(gòu)造函數(shù)例子class Studentpublic: Student(int i) cout constructing student.n; semesHours=i; Student()cout“Studentn”;protected: int semesHours;class Teacherpublic: Teacher
12、( string p) cout constructing teacher.n; name = p; Teacher()cout“Teachern”;private: string name; ;class TutorPairpublic: TutorPair(int i,int j,string p):teacher(p),student(j) cout constructing tutorpair.n;noMeetings = i; TutorPair()cout“TutorPairn”;protected: Student student; Teacher teacher; int no
13、Meetings; ; int main() TutorPair tp(5,20,Tim); cout back in main.n;return 0;構(gòu)造函數(shù)初始化常數(shù)據(jù)成員和引用成員class Studentpublic: Student(int s,int &k):i(s),j(k) /不可以直接賦值void p()coutjendl;protected: const int i; int &j;int main() int c=123; Student s(9818,c); s.p();return 0;對(duì)象構(gòu)造順序n局部和靜態(tài)局部對(duì)象(文件作用域)以文本定義順序?yàn)轫樞?/p>
14、,(類成員屬于此種情況) n靜態(tài)對(duì)象在首次定義時(shí)構(gòu)造一次;程序結(jié)束析構(gòu)n全局對(duì)象在main之前構(gòu)造;程序結(jié)束時(shí)析構(gòu)n全局對(duì)象如果分布在不同文件中,則構(gòu)造順序隨機(jī) 例子class Apublic:A(int k)s=k; coutkA is constructingn;A()coutsAn;int s;int main()coutmain is runningn; A s(1); void f(); f(); f(); return 0;void f() coutf is runningn; A s(2); static A t(3);A t(4);練習(xí)n重寫Rectangle,將坐標(biāo)抽象為Po
15、int類,通過冒號(hào)語法對(duì)Rectangle中的Point類進(jìn)行初始化 為對(duì)象申請(qǐng)動(dòng)態(tài)空間nMalloc和對(duì)應(yīng)的free函數(shù)不能調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),這破壞了:空間分配、初始化的功能。所以引入了new和delete。n因?yàn)榭臻g不確定才使用堆空間n函數(shù)內(nèi)部的申請(qǐng)空間要及時(shí)釋放,否則容易造成內(nèi)存泄漏mallocnewclass aa public: aa(int a=1)id=a;cout 構(gòu)造 endl; int id; aa()cout“aa is 析構(gòu).” endl;int main() aa *p=new aa(9); coutid; aa *q=(aa *)malloc(sizeof(a
16、a); coutid;/隨機(jī)數(shù),表明構(gòu)造函數(shù)未調(diào)用 delete p; free(q);/析構(gòu)函數(shù)未調(diào)用return 0;例子class aa public: aa(int a=1)id=a; int id;aa & m() aa *p=new aa(9); return(*p);int main() aa & s = m();couts.id;/結(jié)果為9 表明沒有釋放return 0;例子class aa public: aa(int a=1)id=a; int id;aa & m() aa *p=new aa(9); delete p; /釋放后不應(yīng)該再返回 ret
17、urn(*p);int main() aa & s = m();coutage0 = 20; int * t = s-age; delete s; coutvalue; Student() coutvalueendl;protected: int value;int main() Student *p=new Student5; cout“Delete Begin”i; Student *p=new Student * i ; for(j=0;jtemp; pj=new Student(temp); cout=0;j-) delete pj; delete p; couti; int*
18、 p=new int i; deletep;對(duì)象的賦值class Studentstring name; int semesHours; public: Student(string pName=“”,int i=0) name=pName; semesHours=I; ;Student a(jenny,50);Student b;b=a;n一個(gè)已知對(duì)象賦值給另一個(gè)已知對(duì)象,通過對(duì)賦值運(yùn)算符的重載實(shí)現(xiàn)的Student& operator=(const Student& rValue)name=rV;semesHours=rValue.semesHours;re
19、turn *this;對(duì)象的拷貝n用一個(gè)已知對(duì)象構(gòu)造(初始化)一個(gè)新對(duì)象。Student s1(“Jenny”); Student s2=s1;即Student s2(s1); Student fn(Student s)Student k;/. ;return k/window下 int main()Student m,n; n=fn(m); return 0;n拷貝構(gòu)造函數(shù)Student(const Student& s) name=; semesHours=s.semesHours; 例子-練習(xí),調(diào)用哪個(gè)函數(shù)class Studentpublic: Student(in
20、t k):i(k) Student ()void p()coutiendl;protected: int i;int main() Student s(9818); s.p(); Student t(s); t.p(); Student m; m=t; m.p();return 0;重寫拷貝構(gòu)造函數(shù)class Studentpublic: Student(int k):i(k) Student ()void p()coutip(); Student m;m=s; m.p();return 0;淺拷貝class aa public: aa()f=new char10; aa() delete f
21、; char * f;int main()aa p; strcpy(p.f,Computer); coutp.fendl; aa q(p); / aa q=p; coutq.fendl; strcpy(p.f,Software); coutq.fp.fendl;return 0;n創(chuàng)建創(chuàng)建q時(shí),對(duì)象時(shí),對(duì)象p被復(fù)制給了被復(fù)制給了q,但資源未復(fù)制,使得,但資源未復(fù)制,使得p和和q指向同一個(gè)資源,這稱為淺拷貝指向同一個(gè)資源,這稱為淺拷貝n同一個(gè)指針執(zhí)行兩遍同一個(gè)指針執(zhí)行兩遍delete操作,會(huì)發(fā)生什么?災(zāi)難,可能會(huì)破壞該堆及自由內(nèi)存表操作,會(huì)發(fā)生什么?災(zāi)難,可能會(huì)破壞該堆及自由內(nèi)存表深拷貝clas
22、s aa public: aa()f=new char10; aa(aa const & s) f=new char10; strcpy(f,s.f); aa()delete f; char * f;int main()aa p; strcpy(p.f,Computer); coutp.fendl; aa q(p); coutq.fendl; strcpy(p.f,”Software”); coutp.fq.fendl;return 0;例子-練習(xí)class Studentpublic: Student(int i) value=i; coutStudentvalueendl; Stu
23、dent()coutStudentvalueendl;protected: int value;int main() Student(9); Student *p=&Student(8); Student &q=Student(7); Student i(6); i = Student(5); return 0; 類型轉(zhuǎn)換class aa public: aa(int a=1)id=a;cout構(gòu)造構(gòu)造endl; aa (const aa & s)id = s.id;cout拷貝拷貝endl; int & Getid()return(id);private: i
24、nt id;int main()aa m; /“構(gòu)造構(gòu)造” aa n(m); /“拷貝拷貝” aa o = m; /“拷貝拷貝” 和和aa o(m)等價(jià)等價(jià) aa s = 9; /“構(gòu)造構(gòu)造” 和和aa s(9)等價(jià)等價(jià) aa t; /“構(gòu)造構(gòu)造” t = 9; / “構(gòu)造構(gòu)造”、 賦值運(yùn)算賦值運(yùn)算 return 0; 類型轉(zhuǎn)換class aa public: aa(int a=1)id=a; char * p; int id;void m(aa a)couta.idendl;int main() m(9); /相當(dāng)于相當(dāng)于m(aa(9); return 0;n如果存在如果存在m(int)的函
25、數(shù)則優(yōu)先匹配的函數(shù)則優(yōu)先匹配類型轉(zhuǎn)換class aa public: aa(int a=1)id=a; int id;class bb public: bb(int a=2)id=a; int id;void m(aa a)couta.idendl;void m(bb a)couta.idendl;int main() m(9); /存在二義性存在二義性; return 0;類型轉(zhuǎn)換class HighWorker float income;public: HighWorker(float a = 2000.0)income = a; float Getincome()return(income);class Worker float income; public: Worker(float a = 1200.0)income = a; Worker(HighWorker b)income = 0.75*b.Getincome(); float Getincome()return(income);void m(Worker a)couta.Getincome()endl;int main() Worker a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 反家暴知識(shí)培訓(xùn)系列課件
- 清查情況報(bào)告范文
- MySQL教程(新體系-綜合應(yīng)用實(shí)例視頻)(第4版) 習(xí)題-第09章-答案
- 二零二五年度旅游民宿物業(yè)一體化管理合同
- 2025年度道路鋪磚施工工程保險(xiǎn)與理賠合同
- 二零二五年度順豐速運(yùn)快遞安全運(yùn)輸管理合同
- 2025年度籃球比賽裁判員及教練員選聘合同
- 2025年度汽車制造廠房租賃合同
- 2025年度股權(quán)質(zhì)押與資產(chǎn)證券化合作合同
- 廣東省2025年度簡(jiǎn)易勞動(dòng)合同制作與備案流程合同
- 環(huán)衛(wèi)應(yīng)急預(yù)案8篇
- 《與顧客溝通的技巧》課件
- 2024年大學(xué)生創(chuàng)業(yè)投資意向書
- 【蘇寧易購(gòu)建設(shè)財(cái)務(wù)共享服務(wù)中心的現(xiàn)存問題及優(yōu)化建議探析(論文)13000字】
- 《現(xiàn)代家政導(dǎo)論》電子教案 5.3模塊五項(xiàng)目三我國(guó)家政服務(wù)業(yè)發(fā)展認(rèn)知
- 人教統(tǒng)編版高中歷史選擇性必修一第三單元-法律與教化-復(fù)習(xí)課件
- 成語故事-鄭人買履-課件
- 化學(xué)實(shí)驗(yàn)室安全培訓(xùn)課件
- 數(shù) 學(xué)2024-2025學(xué)年人教版七年級(jí)數(shù)學(xué)上冊(cè)有理數(shù)混合運(yùn)算100題
- 上消化道異物的內(nèi)鏡處理
- 農(nóng)產(chǎn)品食品檢驗(yàn)員二級(jí)技師技能理論考試題含答案
評(píng)論
0/150
提交評(píng)論