構(gòu)造和析構(gòu)函數(shù)_第1頁
構(gòu)造和析構(gòu)函數(shù)_第2頁
構(gòu)造和析構(gòu)函數(shù)_第3頁
構(gòu)造和析構(gòu)函數(shù)_第4頁
構(gòu)造和析構(gòu)函數(shù)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論