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

下載本文檔

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

最新文檔

評(píng)論

0/150

提交評(píng)論