第五章特殊函數(shù)和成員_第1頁
第五章特殊函數(shù)和成員_第2頁
第五章特殊函數(shù)和成員_第3頁
第五章特殊函數(shù)和成員_第4頁
第五章特殊函數(shù)和成員_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第五章特殊函數(shù)和成員1第一頁,共一百一十一頁,編輯于2023年,星期四A類的構(gòu)造函數(shù)定義如下:A::A(參數(shù)0):成員1(參數(shù)1),成員2(參數(shù)2),成員n(參數(shù)表n){//其他操作……}注:如果初始化列表某項的參數(shù)表為空,則列表中相應(yīng)的項可以省略。第二頁,共一百一十一頁,編輯于2023年,星期四如有:classdate{ intyear,month,day;public: ……};classstudent{

intnum;stringname;

datebirthday;public:……};則student類的構(gòu)造函數(shù)形式為:student(intn,strings,dated):num(n),name(s),birthday(d){……}第三頁,共一百一十一頁,編輯于2023年,星期四若對象B是類A的子對象,則在建立A類對象時:執(zhí)行B的構(gòu)造函數(shù)(初始化類中的其他成員)構(gòu)造順序執(zhí)行B的構(gòu)造函數(shù)(初始化B的數(shù)據(jù)成員)執(zhí)行B的析構(gòu)函數(shù)執(zhí)行A的析構(gòu)函數(shù)析構(gòu)順序注意:1)A產(chǎn)生對象時,先調(diào)用對象成員的構(gòu)造函數(shù),初始化對象成員,然后才執(zhí)行A的構(gòu)造函數(shù),對象成員的初始化順序與這些對象在類A中的說明順序,與它們在初始化列表中的順序無關(guān)。第四頁,共一百一十一頁,編輯于2023年,星期四注意:2)A類的構(gòu)造函數(shù)中未給出成員對象初始化的,成員對象產(chǎn)生時調(diào)用無參構(gòu)造函數(shù),若此時成員所在類中沒有無參構(gòu)造函數(shù)則報錯!第五頁,共一百一十一頁,編輯于2023年,星期四找出下面程序的錯誤,改正后分析程序結(jié)果(lt5_1b.cpp)classA{intx1,y1;public:

A(intc,intd){x1=c;y1=d;cout<<"A構(gòu)造!"<<x1<<y1<<endl;}};classB{Aa;intx2,y2;public:B(){cout<<"B默認構(gòu)造!";}

B(intc=0,intd=0){x2=c;y2=d;cout<<"B構(gòu)造!"<<x2<<y2<<endl;}};voidmain(){ Bb;}A(){cout<<"A默認構(gòu)造"<<endl;}}Bb(1,2);B(intc,intd,intx,inty):a(x,y)Bb(1,2,10,100);第六頁,共一百一十一頁,編輯于2023年,星期四練習(xí):給出程序運行結(jié)果(lt5_1.cpp)#include<iostream>usingnamespacestd;classPoint{intx,y;public: Point():x(0),y(0){} Point(inta,intb):x(a),y(b){cout<<"構(gòu)造:"<<x<<","<<y<<endl;}};classRectangle{Pointa;Pointb;public: Rectangle(intx,inty,intm,intn):a(x,y),b(m,n){}};voidmain(){Rectanglea(1,1,5,5);}b(m,n),a(x,y)第七頁,共一百一十一頁,編輯于2023年,星期四對象成員的初始化第八頁,共一百一十一頁,編輯于2023年,星期四const成員和引用成員的初始化數(shù)據(jù)成員不能在定義時初始化數(shù)據(jù)成員操作語句必須放在成員函數(shù)中引用成員不能初始化為常量的引用const成員和引用成員必須在構(gòu)造函數(shù)初始化列表中初始化(lt5_1c.cpp)初始化列表形式的構(gòu)造函數(shù):A::A(參數(shù)0):成員1(參數(shù)1),成員2(參數(shù)2){……}第九頁,共一百一十一頁,編輯于2023年,星期四usingnamespacestd;classexample{ constintnum; intdata;

int&ref;public: example(intn,intf):num(n),data(f),ref(data) {cout<<"構(gòu)造..."<<endl;} voidshow() {cout<<"對象中的數(shù)據(jù)是:"<<num<<","<<data<<","<<ref<<endl;}};voidmain(){intx=1,y=2;examplea(x,y);a.show();}第十頁,共一百一十一頁,編輯于2023年,星期四定義時使用了static,則成員為靜態(tài)成員5.2靜態(tài)成員說明:1)靜態(tài)數(shù)據(jù)成員必須在類體外按照如下格式:類型類名::靜態(tài)成員名=值;進行初始化,不可在構(gòu)造函數(shù)中初始化第十一頁,共一百一十一頁,編輯于2023年,星期四classTest{

staticintx; intn;public: Test(){} Test(inta,intb){x=a;n=b;}

staticintfunc(){returnx;}

staticvoidsfunc(Test&r,inta){r.n=a;} intGetn(){returnn;}};intTest::x=25;靜態(tài)數(shù)據(jù)成員的初始化第十二頁,共一百一十一頁,編輯于2023年,星期四4、靜態(tài)成員是類的成員不是對象的成員2、static成員的所有者是類,被該類的所有對象所共有,所有對象均可訪問靜態(tài)成員。靜態(tài)成員仍然遵循public,private,protected訪問準(zhǔn)則。

3、靜態(tài)成員不依賴于對象而存在對象不存在時靜態(tài)成員已存在5、靜態(tài)成員函數(shù)沒有this指針,不可直接使用非靜態(tài)成員,

必須通過對象(或者指向?qū)ο蟮闹羔槪┦褂梅庆o態(tài)成員。第十三頁,共一百一十一頁,編輯于2023年,星期四classTest{

staticintx; intn;public: Test(){} Test(inta,intb){x=a;n=b;}

staticintfunc(){returnx;}

staticvoidsfunc(Test&r,inta){r.n=a;} intGetn(){returnn;}};intTest::x=25;類中的任何函數(shù)都可以訪問靜態(tài)成員。靜態(tài)成員函數(shù)不能直接訪問非靜態(tài)數(shù)據(jù)成員,可以通過對象來訪問。(inta){n=a;}error:illegalreferencetodatamember'Test::n'inastaticmemberfunction.第十四頁,共一百一十一頁,編輯于2023年,星期四7、未定義對象時,可以通過類使用靜態(tài)成員按如下格式:類名::靜態(tài)數(shù)據(jù)成員名類名::靜態(tài)成員函數(shù)();6、靜態(tài)成員函數(shù)不能說明為虛函數(shù)(第8章)第十五頁,共一百一十一頁,編輯于2023年,星期四classTest{ intn;

public: Test(){} Test(inta,intb){x=a;n=b;}

staticintfunc(){returnx;}

staticvoidsfunc(Test&r,inta){r.n=a;} intGetn(){returnn;}};intTest::x=25;voidmain(){cout<<Test::func();}通過類使用靜態(tài)成員函數(shù)staticintx;cout<<Test::x();通過類使用靜態(tài)成員函數(shù)或者數(shù)據(jù)成員第十六頁,共一百一十一頁,編輯于2023年,星期四classTest{ intn;

staticintx;public: Test(){} Test(inta,intb){x=a;n=b;}

staticintfunc(){returnx;}

staticvoidsfunc(Test&r,inta){r.n=a;} intGetn(){returnn;}};intTest::x=25;voidmain(){Testb,c;b.sfunc(b,58);cout<<""<<b.Getn();cout<<""<<b.func();cout<<""<<c.func();Testa(24,56);cout<<""<<a.func()<<""<<b.func()<<""<<c.func()<<endl;}582525242424第十七頁,共一百一十一頁,編輯于2023年,星期四classTest{intn; staticintx;public: Test(){} Test(inta,intb){x=a;n=b;} staticintfunc(){n=x+1;returnx;} staticvoidsfunc(Test&ref,inta){ref.n=a;} intGetn(){returnn;}};找出下面類定義中的錯誤,并說明原因intTest::x=100;靜態(tài)成員函數(shù)不能直接訪問非靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員必須進行初始化第十八頁,共一百一十一頁,編輯于2023年,星期四1,靜態(tài)成員函數(shù)與類名連用,可通過對象使用classtest{

staticintx; intn;public: test(inta=0,intb=0){x=a;n=b;}

staticintfunc(){returnx;} intgetn(){returnn;}};inttest::x=25;voidmain(){ cout<<test::func()<<endl; testb; cout<<b.func()<<endl;}與類名連用通過對象使用第十九頁,共一百一十一頁,編輯于2023年,星期四2,在沒有建立對象之前,靜態(tài)成員已經(jīng)存在classtest{

staticintx; intn;public: test(inta=0,intb=0){x=a;n=b;}

staticintfunc(){returnx;} intgetn(){returnn;}};inttest::x=25;voidmain(){ cout<<test::func()<<endl; testb,c; cout<<b.func()<<endl;}第二十頁,共一百一十一頁,編輯于2023年,星期四3,靜態(tài)成員是類的成員不是對象的成員classtest{

staticintx; intn;public: test(inta=0,intb=0){x=a;n=b;}

staticintfunc(){returnx;} intgetn(){returnn;}};inttest::x=25;voidmain(){ cout<<test::func()<<endl; testb,c; cout<<b.func()<<endl;}第二十一頁,共一百一十一頁,編輯于2023年,星期四4,靜態(tài)成員被類的所有對象共享classtest{

staticintx; intn;public: test(inta=0,intb=0){x=a;n=b;}

staticintfunc(){returnx;} intgetn(){returnn;}};inttest::x=25;voidmain(){ cout<<test::func()<<endl; testb,c; cout<<b.func()<<c.func()<<endl;}第二十二頁,共一百一十一頁,編輯于2023年,星期四5,靜態(tài)成員函數(shù)不可使用非靜態(tài)成員classtest{

staticintx; intn;public: test(inta=0,intb=0){x=a;n=b;}

staticintfunc(){returnn;}

};inttest::x=25;voidmain(){ cout<<test::func()<<endl; testb,c; cout<<b.func()<<c.func()<<endl;}錯誤第二十三頁,共一百一十一頁,編輯于2023年,星期四特點:一旦定義一直存在于內(nèi)存中,直到程序結(jié)束才釋放復(fù)合語句(用{}括起來的多條語句)內(nèi)定義的對象只在復(fù)合語句內(nèi)有效,復(fù)合語句執(zhí)行完畢,對象釋放內(nèi)存。5.2靜態(tài)成員---靜態(tài)對象靜態(tài)對象是由static聲明的類的對象第二十四頁,共一百一十一頁,編輯于2023年,星期四classtest{intn;public: test(inti){n=i;cout<<"構(gòu)造:"<<n<<endl;} ~test(){cout<<"析構(gòu):"<<n<<endl;} intgetn(){returnn;} voidinc(){++n;}};voidmain(){cout<<"循環(huán)開始"<<endl;for(inti=0;i<2;i++)

{cout<<"i="<<i<<"時:"<<endl;

testb(3);b.inc();cout<<"b.n="<<b.getn()<<endl;

}cout<<"循環(huán)結(jié)束"<<endl;cout<<"main結(jié)束"<<endl;}bi=0時:34循環(huán)開始構(gòu)造:3b=4析構(gòu)4i=0時:bi=1時:34第二十五頁,共一百一十一頁,編輯于2023年,星期四classtest{intn;public: test(inti){n=i;cout<<"構(gòu)造:"<<n<<endl;} ~test(){cout<<"析構(gòu):"<<n<<endl;} intgetn(){returnn;} voidinc(){++n;}};voidmain(){cout<<"循環(huán)開始"<<endl;for(inti=0;i<2;i++)

{cout<<"i="<<i<<"時:"<<endl;

testb(3);b.inc();cout<<"b.n="<<b.getn()<<endl;

}cout<<"循環(huán)結(jié)束"<<endl;cout<<"main結(jié)束"<<endl;}statictestb(3);bi=0時:34循環(huán)開始構(gòu)造:3b=4i=0時:i=1時:i=1時:5b=5循環(huán)結(jié)束main結(jié)束析構(gòu)5第二十六頁,共一百一十一頁,編輯于2023年,星期四voidmain(){cout<<"循環(huán)開始"<<endl;for(inti=0;i<2;i++)

{cout<<"i="<<i<<"時:"<<endl;

testb(3);b.inc();cout<<"b.n=“<<b.getn()<<endl;

}cout<<"循環(huán)結(jié)束"<<endl;cout<<"main結(jié)束"<<endl;}voidmain(){cout<<"循環(huán)開始"<<endl;for(inti=0;i<2;i++)

{cout<<"i="<<i<<"時:"<<endl;statictestb(3);b.inc();cout<<"b.n=“<<b.getn()<<endl;

}cout<<"循環(huán)結(jié)束"<<endl;cout<<"main結(jié)束"<<endl;}第二十七頁,共一百一十一頁,編輯于2023年,星期四注:靜態(tài)對象的構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)特點:1、構(gòu)造函數(shù)在代碼執(zhí)行過程中,第一次遇到它的變量定義時被調(diào)用,但直到整個程序結(jié)束之前僅調(diào)用一次。2、析構(gòu)函數(shù)在整個程序退出之前被調(diào)用,同樣也只調(diào)用一次。即:遇到定義則調(diào)用構(gòu)造函數(shù),程序結(jié)束調(diào)用析構(gòu)函數(shù)構(gòu)造函數(shù)只調(diào)用一次,析構(gòu)函數(shù)也只調(diào)用一次第二十八頁,共一百一十一頁,編輯于2023年,星期四課程回顧2.一個const對象只能訪問

成員函數(shù)。3.設(shè)類Test中存在成員staticintx,則下列哪種初始化方式是正確的()A.Test::intx=25; B.intx=25;C.intTest::x=25; D.intTestx=25;constC4.類A中存在公有的靜態(tài)數(shù)據(jù)成員x,設(shè)a和b是類A的兩個對象,在執(zhí)行a.x=10之后,b.x的值為(

)A.未初始化

B.等于a.xC.等于0

D.隨機

B1.若類的成員函數(shù)用關(guān)鍵字static進行修飾,這樣的成員函數(shù)稱為

。靜態(tài)成員函數(shù)第二十九頁,共一百一十一頁,編輯于2023年,星期四

5.關(guān)于類的靜態(tài)成員函數(shù)描述錯誤的是()A.在創(chuàng)建對象前不存在B.可以被非靜態(tài)成員函數(shù)訪問C.可以直接被靜態(tài)成員函數(shù)訪問D.不是對象的成員A第三十頁,共一百一十一頁,編輯于2023年,星期四6.找出下列程序中的錯誤,并說明原因#include<iostream.h>classtest{private:intx;public:test(inta){x=a;}voidset(inta){x=a;}voidget(){cout<<x<<endl;}}main(){consttesta(3);a.set(5);a.get();}不能改變常對象的數(shù)據(jù)成員的值第三十一頁,共一百一十一頁,編輯于2023年,星期四5.3友元函數(shù)友元提供給了不同類或者對象的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進行數(shù)據(jù)共享的機制。也就是說,通過友元,一個普通函數(shù)或者類的成員函數(shù)可以訪問到封裝于另一個類中的數(shù)據(jù),這相當(dāng)于給類的封裝開了一個小孔,通過它可以看到類內(nèi)部的一些屬性。如果友元是一般函數(shù)或者類的成員函數(shù),則稱為友元函數(shù)。友元函數(shù)是擁有成員函數(shù)一切權(quán)利的非成員函數(shù)。也就是說,友元函數(shù)不是類的成員函數(shù),但可以像成員函數(shù)一樣直接訪問類的私有成員。如果友元是一個類,則稱為友元類,友元類的所有成員函數(shù)都為友元函數(shù)。第三十二頁,共一百一十一頁,編輯于2023年,星期四友元的三種形式:1、普通函數(shù)作一個類的友元2、將a類的成員函數(shù)作b類的友元3、將一個類a作為另一個類b的友元第三十三頁,共一百一十一頁,編輯于2023年,星期四一個友元類/函數(shù)/成員函數(shù)可以通過對象使用另一個類的私有成員。友元函數(shù)可以訪問

對象的私有成員,公有成員和保護成員。友元可以是一個類或函數(shù)。友元需通過對象、對象的引用、對象的指針來使用類的成員。第三十四頁,共一百一十一頁,編輯于2023年,星期四在類外對fun函數(shù)進行定義,

此時fun函數(shù)不是類的成員函數(shù)友元聲明可以在類的private和public部分普通友元函數(shù)可以通過對象、對象的引用、對象的指針使用對象的私有成員。一、普通函數(shù)作一個類的友元在類體內(nèi)用friend對普通函數(shù)fun進行聲明,則fun成為類的友元函數(shù)。第三十五頁,共一百一十一頁,編輯于2023年,星期四在類體內(nèi)需要對友元函數(shù)進行聲明classpoint{ doublex,y;public: point(doublexi,doubleyi){x=xi;y=yi;}

frienddoubledist(point&p1,point&p2);};doubledist(point&p1,point&p2){ doubledx=p1.x-p2.x; doubledy=p1.y-p2.y; returnsqrt(dx*dx+dy*dy);}在類中聲明,但不是成員函數(shù)point&p1,point&p2友元函數(shù)不是類的成員函數(shù),沒有this指針,所以必須用對象或者引用或者對象的指針做參數(shù)。point::dist(point&p1,point&p2)第三十六頁,共一百一十一頁,編輯于2023年,星期四classpoint{ doublex,y;public: point(doublem,doublen){x=m;y=n;}

friend

doubledist(point&p1,point&p2);};doubledist(point&p1,point&p2){ doubledx=p1.x-p2.x; doubledy=p1.y-p2.y; returnsqrt(dx*dx+dy*dy);}voidmain(){ pointp1(1.1,2.2),p2(3.3,4.4); cout<<dist(p1,p2)<<endl;}第三十七頁,共一百一十一頁,編輯于2023年,星期四引用做形參和對象做形參的區(qū)別是什么??對象做形參,形參對象

內(nèi)存,會引起

函數(shù)調(diào)用

引用做形參,形參

內(nèi)存,

復(fù)制構(gòu)造函數(shù)對象做形參,形參改變

引起實參改變。引用做形參,形參改變

引起實參改變指針做形參也可實現(xiàn),注意其形式什么?復(fù)制構(gòu)造不分配分配不調(diào)用會不會第三十八頁,共一百一十一頁,編輯于2023年,星期四classpoint{ doublex,y;public: point(doublem,doublen){x=m;y=n;}

friend

doubledist(point&p1,point&p2);};doubledist(point&p1,point&p2){ doubledx=p1.x-p2.x; doubledy=p1.y-p2.y; returnsqrt(dx*dx+dy*dy);}voidmain(){ pointp1(1.1,2.2),p2(3.3,4.4); cout<<dist(p1,p2)<<endl;}->**->->->&&第三十九頁,共一百一十一頁,編輯于2023年,星期四假定f()是類A中的成員函數(shù)可以在類B中聲明將類A的成員函數(shù)f()聲明為類B的友元聲明函數(shù)f時需限定該函數(shù)f是類A的成員函數(shù)并在f中訪問B的成員時,需通過對象、引用、指針來進行訪問。二、A類的成員函數(shù)作B類的友元classA{……voidf(B&);……};classB{……

friendvoidA::f(B&);……};將A類的成員函數(shù)f說明為該類的友元第四十頁,共一百一十一頁,編輯于2023年,星期四classTwo;classOne{intx;public: One(inta):x(a){}; intGetx(){returnx;}

voidfunc(Two&);};//不完全的類聲明(Two),以便在類One中引用Two直接使用類Two的私有成員classTwo{ inty;public: Two(intb):y(b){} intGety(){returny;}

friendvoidOne::func(Two&);};voidOne::func(Two&r){r.y=x;}錯誤:不完全聲明的類不能實例化。不能存取沒有完全聲明的類成員。第四十一頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>usingnamespacestd;classTwo;classOne{intx;public: One(inta):x(a){}; intGetx(){returnx;} voidfunc(Two&);};classTwo{inty;public:Two(intb):y(b){}intGety(){returny;}friendvoidOne::func(Two&);};voidOne::func(Two&r){r.y=x;}voidmain(){Oneobj1(5);Twoobj2(8);cout<<obj1.Getx()<<","<<obj2.Gety()<<endl;obj1.func(obj2);cout<<"調(diào)用友元成員函數(shù)后:"<<endl;cout<<obj1.Getx()<<","<<obj2.Gety()<<endl;}5,8調(diào)用友元成員函數(shù)后:5,5第四十二頁,共一百一十一頁,編輯于2023年,星期四在類B中聲明類A為B的友元格式:classB{……

friendclassA……}二、將一個類A說明為另一類B的友元注:如果類A為類B的友元,則類A中的所有成員函數(shù)均居于友元函數(shù)的功能。第四十三頁,共一百一十一頁,編輯于2023年,星期四classTwo;classOne{intx;public: One(inta):x(a){}; intGetx(){returnx;}

voidfunc(Two&);};classTwo{ inty;public: Two(intb):y(b){} intGety(){returny;}

};voidOne::func(Two&r){r.y=x;}friendvoidOne::func(Two&);friendclassOne;思考:此聲明能不能省略?思考:func函數(shù)的定義可否放在類Two的定義前?不能不能voidmain(){Oneobj1(5);Twoobj2(8);cout<<obj1.Getx()<<","<<obj2.Gety()<<endl;obj1.func(obj2);cout<<"調(diào)用友元成員函數(shù)后:"<<endl;cout<<obj1.Getx()<<","<<obj2.Gety()<<endl;}第四十四頁,共一百一十一頁,編輯于2023年,星期四總結(jié):1、友元聲明與訪問控制無關(guān)。在private和public后聲明效果相同。2、友元關(guān)系是不能傳遞的。若A是B的友元,B是C的友元,A不能自動稱為C的友元。注意:此時哪個類能訪問哪個類的成員????3、友元關(guān)系是單向的。若A是B的友元,B不一定是A的友元。

第四十五頁,共一百一十一頁,編輯于2023年,星期四友元的三種形式:1,普通函數(shù)作一個類的友元2,a類的成員函數(shù)作b類的友元3,a類作為b類的友元課程回顧第四十六頁,共一百一十一頁,編輯于2023年,星期四1.下列關(guān)于友元的描述錯誤的是()A.成員函數(shù)不可作友元 B.類可以作友元C.普通函數(shù)可以作友元 D.靜態(tài)函數(shù)可以作友元2.友元函數(shù)可以存取類的_______、公有成員和保護成員。3.在C++中,雖然友元提供了類之間數(shù)據(jù)進行訪問的一種方式,但它破壞了面向?qū)ο蟪绦蛟O(shè)計的_______特性。4.如果類A被聲明成類B的友元,則()A.類A的成員即類B的成員B.類B的成員即類A的成員C.類A的成員函數(shù)不得訪問類B的成員D.類B不一定是類A的友元A私有成員封裝D第四十七頁,共一百一十一頁,編輯于2023年,星期四5.對于友元描述正確的是()A.友元是本類的成員函數(shù) B.友元不是本類的成員函數(shù)C.友元不是函數(shù) D.友元不能訪問本類私有成員B第四十八頁,共一百一十一頁,編輯于2023年,星期四6、給岀以下程序的執(zhí)行結(jié)果。#include<iostream.h>classsample{intn;public: sample(inti){n=i;} friendintadd(sample&s1,sample&s2);};intadd(sample&s1,sample&s2){returns1.n+s2.n;}voidmain(){samples1(10),s2(20);cout<<add(s1,s2)<<endl;}第四十九頁,共一百一十一頁,編輯于2023年,星期四7、先找出程序中的錯誤,更正后分析程序的執(zhí)行結(jié)果:#include<iostream.h>classB;classA{inti;friendB;voiddisp(){cout<<i<<endl;}};classB{public:voidset(intn){Aa;a.i=n;a.disp();}};voidmain(){Bb;b.set(2);}第五十頁,共一百一十一頁,編輯于2023年,星期四作業(yè)課本126頁,編程題第1題第五十一頁,共一百一十一頁,編輯于2023年,星期四const變量定義時需要初始化。constintx=0;constint*p=&x;int*constp=&x;constint*constp=&x;5.4const對象const可限定變量、指針、對象、函數(shù)、函數(shù)的參數(shù)、數(shù)據(jù)成員、成員函數(shù)。表示不可改變。第五十二頁,共一百一十一頁,編輯于2023年,星期四常量成員(const成員)包括:常量數(shù)據(jù)成員(const數(shù)據(jù)成員)常引用(const限定的引用)靜態(tài)常數(shù)據(jù)成員(staticconst數(shù)據(jù)成員)一、常量成員特別注意:1)靜態(tài)常數(shù)據(jù)成員仍保留靜態(tài)成員特征,需要在類外初始化。2)常量數(shù)據(jù)成員和常引用成員必須在構(gòu)造函數(shù)的初始化列表中進行初始化。第五十三頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>(lt5_7.cpp)usingnamespacestd;classBase{intx;constinta;//常數(shù)據(jù)成員staticconstintb;//靜態(tài)常數(shù)據(jù)成員constint&r;//常引用public:Base(int,int);voidshow(){cout<<x<<","<<a<<","<<b<<endl;}voiddisplay(constdouble&r){cout<<r<<endl;}};constintBase::b=125;Base::Base(inti,intj):x(i),a(j){}voidmain(){Basea1(104,118),a2(119,140);a1.show();a2.show();a1.display(3.14159);}先找出程序中的錯誤并改正,然后分析程序結(jié)果。常數(shù)據(jù)成員必須通過初始化列表來獲得初值,r(x){}常數(shù)據(jù)成員和常引用都必須通過初始化列表來獲得初值<<","<<r<<endl;}第五十四頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>usingnamespacestd;classBase{intx;constinta;staticconstintb;constint&r;public:Base(int,int);voidshow(){cout<<x<<","<<a<<","<<b<<","<<r<<endl;}

voiddisplay(constdouble&ref){cout<<ref<<endl;}};constintBase::b=125;Base::Base(inti,intj):x(i),a(j),r(x){}voidmain(){Basea1(104,118),a2(119,140);doublex=3.14159;a1.show();a2.show();a1.display(x);}常引用做函數(shù)參數(shù),只是把實參的值提供給函數(shù)使用,不允許函數(shù)改變對象的值。第五十五頁,共一百一十一頁,編輯于2023年,星期四引用作形參的特點:形參改變會使得實參改變,引用作形參,形參不分配內(nèi)存有時需要使用引用作形參但要求形參不能改變此時可使用const限定二、const引用作參數(shù)第五十六頁,共一百一十一頁,編輯于2023年,星期四對象聲明前加上const限定,一般定義格式為:

類名const對象名;或者

const類型對象名三、常對象(const對象)

例如:baseconsta(25,68);constbaseb(21,32);注意:1)在定義常對象時必須進行初始化。2)常對象的數(shù)據(jù)成員不能被更新。第五十七頁,共一百一十一頁,編輯于2023年,星期四分析以下程序結(jié)果(lt5_7a.cpp)#include<iostream>usingnamespacestd;classbase{intx,y;public: base():x(0),y(0){} base(inta,intb):x(a),y(b){} voidshow() {cout<<x<<","<<y<<endl; cout<<++x<<","<<++y<<endl;}};voidmain(){basea;a.show();baseb(10,20);b.show();}第五十八頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>usingnamespacestd;classbase{intx,y;public: base():x(0),y(0)

{} base(inta,intb):x(a),y(b){}

voidset(inta,intb){x=a;y=b;}voidshow() {cout<<x<<","<<y<<endl;}};voidmain(){basea;a.show();constbaseb(10,20);}編譯錯誤:不能改變常對象數(shù)據(jù)成員的值找出程序中的錯誤,并說明原因a.set(1,2);b.set(1,2);b.show();思考:如何顯示b的數(shù)據(jù)成員?編譯錯誤:常對象只能調(diào)用常成員函數(shù)。第五十九頁,共一百一十一頁,編輯于2023年,星期四四、常成員函數(shù)使用const關(guān)鍵詞聲明的函數(shù)為常成員函數(shù),聲明格式如下:類型函數(shù)名(參數(shù)表)const;注:1)const是函數(shù)說明的一個組成部分,因此在定義部分也要帶const關(guān)鍵詞。2)常成員函數(shù)不能更新對象的數(shù)據(jù)成員,也不能調(diào)用該類中沒有用const修飾的成員函數(shù)。3)一個const對象可以調(diào)用const函數(shù),但不能調(diào)用非const成員函數(shù)。4)const限定的函數(shù)與未加const限定的同名函數(shù)可重載。5)const不可限定析構(gòu)函數(shù)和構(gòu)造函數(shù)。第六十頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>//lt5_7c.cppusingnamespacestd;classbase{intx,y;public: base():x(0),y(0){} base(inta,intb):x(a),y(b){} voidset(inta,intb){x=a;y=b;}

voidshow()

{cout<<x<<","<<y<<endl;cout<<++x<<","<<++y<<endl;}};voidmain(){basea;a.show();

constbaseb(10,20);//常對象

b.show();}const常成員函數(shù)編譯錯誤:常對象只能調(diào)用常成員函數(shù)!錯誤:在常成員函數(shù)中,不能更新對象的數(shù)據(jù)成員}第六十一頁,共一百一十一頁,編輯于2023年,星期四#include<iostream>(lt5_7d.cpp)usingnamespacestd;classbase{intx,y;public: base():x(0),y(0){} base(inta,intb):x(a),y(b){} voidset(inta,intb){x=a;y=b;}voidshow()const//const成員函數(shù) {cout<<x<<","<<y<<endl; }voidshow()

//非const成員函數(shù) {cout<<x<<","<<y<<endl; cout<<++x<<","<<++y<<endl;}};voidmain(){basea;a.show();constbaseb(10,20);b.show();}const限定的函數(shù)與未加const限定的同名函數(shù)可重載。const成員函數(shù)與同名的非const成員函數(shù)可重載。第六十二頁,共一百一十一頁,編輯于2023年,星期四練習(xí):找出程序中的錯誤并改正,然后分析程序結(jié)果(lt5_8.cpp)#include<iostream>usingnamespacestd;classbase{doublex,y;constdoublep;public: base(doublem,doublen,doubled):p(d) {x=m;y=n;} voidshow(); voidshow()const;};voidbase::show(){cout<<x<<","<<y<<",p="<<p<<endl;}voidbase::show()const{cout<<x<<","<<y<<",constp="<<p<<endl;}voidmain(){basea(8.9,2.5,3.1416);constbaseb(2.5,8.9,3.14);a.show();b.show();}第六十三頁,共一百一十一頁,編輯于2023年,星期四總結(jié):1,const數(shù)據(jù)成員必須在構(gòu)造函數(shù)的初始化列表中進行初始化。2,const成員函數(shù)內(nèi)不可出現(xiàn)任何改變變量值的語句。3,const對象只能使用const成員函數(shù),不同對象可以使用全部成員函數(shù)。4,const引用做參數(shù)時,函數(shù)體內(nèi)不可出現(xiàn)改變參數(shù)值的語句。第六十四頁,共一百一十一頁,編輯于2023年,星期四例如:假設(shè)已定義point類。則pointp[3];表示聲明了一個具有3個元素的數(shù)組p,其中的每一個元素都是point類的一個對象。5.5數(shù)組和類類可定義對象數(shù)組和對象指針數(shù)組。一、對象數(shù)組對象數(shù)組是指元素都是對象的數(shù)組。也就是說,如果某一個類有若干個對象,則可以把這一系列被創(chuàng)建的對象用一個數(shù)組來存放。聲明格式:類名數(shù)組名[對象個數(shù)]第六十五頁,共一百一十一頁,編輯于2023年,星期四分析以下程序結(jié)果(lt5_10.cpp)classpoint{intx,y;public:

point():x(0),y(0){}

point(inta):x(a){y=0;}

point(inta,intb):x(a),y(b){}; intgetx(){returnx;} intgety(){returny;}};voidmain(){pointa[3];for(inti=0;i<3;i++)cout<<"a["<<i<<"]:"<<a[i].getx()<<","<<a[i].gety()<<endl;

pointb[3]={1,2,3};for(i=0;i<3;i++)cout<<"b["<<i<<"]:"<<b[i].getx()<<","<<b[i].gety()<<endl;

pointc[3]={point(1,2),point(3,4),point(5,6)};for(i=0;i<3;i++)cout<<"c["<<i<<"]:"<<c[i].getx()<<","<<c[i].gety()<<endl;}//每個元素調(diào)用無參的構(gòu)造函數(shù)//每個元素調(diào)用1個參數(shù)的構(gòu)造函數(shù)//每個元素調(diào)用2個參數(shù)的構(gòu)造函數(shù)編譯器會調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)來建立數(shù)組的每一個分量第六十六頁,共一百一十一頁,編輯于2023年,星期四分析以下程序結(jié)果(lt5_10a.cpp)classpoint{intx,y;public: point(inta,intb):x(a),y(b){}; intgetx(){returnx;} intgety(){returny;}};voidmain(){pointa[3]={point(1,2),point(3,4),point(5,6)};point*p=a;//用指針指向數(shù)組元素for(inti=0;i<3;i++)cout<<"a["<<i<<"]:"<<a[i].getx()<<","<<a[i].gety()<<endl;}(p+i)->getx()(p+i)->gety()第六十七頁,共一百一十一頁,編輯于2023年,星期四二、類對象指針數(shù)組int*p;表示定義一個指針變量intp[5];表示定義一個數(shù)組。int*p[5]表示定義一個有5個元素的數(shù)組,其中每個元素都是一個指針。此類數(shù)組稱為指針數(shù)組。若類point已經(jīng)正確定義如下:classpoint{intx,y;public: point():x(0),y(0){} point(inta):x(a){y=0;} point(inta,intb):x(a),y(b){}; intgetx(){returnx;} intgety(){returny;}};則:pointa(1,2);point*p;p=&a;//指向已有對象p=newpoint;p=newpoint(1,2);可以直接用動態(tài)分配的對象初始化第六十八頁,共一百一十一頁,編輯于2023年,星期四則若定義對象的指針數(shù)組:point*p[3];p[0]=newpoint(1,2);p[1]=newpoint(3,4);p[2]=newpoint(5,6);若類point已經(jīng)正確定義如下:classpoint{intx,y;public:point():x(0),y(0){}point(inta):x(a){y=0;}point(inta,intb):x(a),y(b){};intgetx(){returnx;}intgety(){returny;}};思考:如果輸出p[0]所指對象的成員?cout<<p[0]->getx()<<",”<<p[0]->gety()<<endl;可通過循環(huán)使用p[i]指向的對象。思考:如果輸出每個指針?biāo)笇ο蟮某蓡T?cout<<p[i]->getx()<<",”<<p[i]->gety()<<endl;for(i=0;i<3;i++){}第六十九頁,共一百一十一頁,編輯于2023年,星期四練習(xí):分析以下程序的結(jié)果(lt5_11.cpp):#include<iostream>usingnamespacestd;classpoint{intx,y;public: point():x(0),y(0){} point(inta):x(a){y=0;} point(inta,intb):x(a),y(b){}; intgetx(){returnx;} intgety(){returny;} };voidmain(){point*p[3]={newpoint(1,2),newpoint(3,4),newpoint(5,6)};for(inti=0;i<3;i++)cout<<"p["<<i<<"]:"<<p[i]->getx()<<","<<p[i]->gety()<<endl;}思考:該程序是否有不合理的地方?for(i=0;i<3;i++)

deletep[i];第七十頁,共一百一十一頁,編輯于2023年,星期四一、指向函數(shù)的指針函數(shù)被調(diào)用時需要調(diào)入內(nèi)存函數(shù)的地址:存放函數(shù)的內(nèi)存單元的首地址指針可以存放地址存放函數(shù)地址的指針稱為指向函數(shù)的指針定義形式:類型(*指針名)(參數(shù)列表);函數(shù)指針指向函數(shù)的語句:指針名=函數(shù)名;5.6指向成員函數(shù)的指針第七十一頁,共一百一十一頁,編輯于2023年,星期四例如:intmax(inta,intb){returna>b?a:b;}voidmain(){ int(*p)(int,int); p=max;cout<<max(10,20)<<endl; }定義了一個指針變量p,它可以指向一個返回值是int型,有2個int型參數(shù)的任何函數(shù)。//p指向max函數(shù)或者(*p)(10,20);第七十二頁,共一百一十一頁,編輯于2023年,星期四intA::max(inta,intb){returna>b?a:b;}定義一個指向類A的成員函數(shù)的指針定義形式:類型(類名::*指針名)(參數(shù)類型);例如:int(A::*p)(int,int);函數(shù)指針指向類的成員函數(shù)的語句:指針名=類名::函數(shù)名例如:p=A::max;通過p調(diào)用max的語句(對象.*函數(shù)指針)(參數(shù))第七十三頁,共一百一十一頁,編輯于2023年,星期四例題:按要求完成程序填空,并分析程序結(jié)果(lt5_12.cpp)#include<iostream>usingnamespacestd;classA{intn;public: A(inti):n(i){} intadd(inta){returnn+a;}

};voidmain(){int(A::*p)(int);Ax(10);

p=A::add;cout<<(x.*p)(15)<<endl;

A*q=&x;cout<<(q->*p)(15)<<endl;}定義一個指向A類成員函數(shù)的指針,該成員函數(shù)返回值為int型,有一個int型參數(shù)。使p指向成員函數(shù)add定義一個指針變量q并使其指向?qū)ο髕第七十四頁,共一百一十一頁,編輯于2023年,星期四練習(xí):給出以下程序的運行結(jié)果#include<iostream.h>classsample{public:intx;inty;voiddisp(){cout<<"x="<<x<<",y="<<y<<endl;}};voidmain(){intsample::*pc;void(sample::*qc)();samples;pc=&sample::x;s.*pc=10;pc=&sample::y;s.*pc=20;qc=sample::disp;s.disp();//(s.*qc)();}第七十五頁,共一百一十一頁,編輯于2023年,星期四5.7求解一元二次方程1、建立項目:equation2、建立頭文件equation.h該頭文件中聲明Findroot類,并包含程序需要的頭文件3、建立eqution.cpp文件,實現(xiàn)Findroot類,并包含equation頭文件4、建立find.cpp文件,設(shè)計主函數(shù),輸入方程系數(shù),并求解。包含equation.h頭文件5、編譯、連接、運行第七十六頁,共一百一十一頁,編輯于2023年,星期四2、建立頭文件equation.h該頭文件中聲明Findroot類,并包含程序需要的頭文件#include<iostream>#include<cmath>usingnamespacestd;classFindroot{floata,b,c,d;doublex1,x2;public: Findroot(floatx,floaty,floatz); voidset(float,float,float); voidfind(); voidshow();};第七十七頁,共一百一十一頁,編輯于2023年,星期四3、建立eqution.cpp文件,實現(xiàn)Findroot類,并包含equation頭文件#include"equation.h"Findroot::Findroot(floatx,floaty,floatz):d(b*b-4*a*c){a=x;b=y;c=z;}voidFindroot::set(floatx,floaty,floatz){a=x;b=y;c=z;}voidFindroot::find(){if(d>0){x1=(-b-sqrt(d))/(2*a);x2=(-b+sqrt(d))/(2*a);}elseif(d==0)x1=x2=(-b)/(2*a);else{x1=(-b)/(2*a);x2=sqrt(-d)/(2*a);}}voidFindroot::show(){cout<<"方程"<<a<<"x2"<<"+"<<b<<"x+"<<c<<"=0的根為:"<<endl;if(d>0)cout<<"x1="<<x1<<",x2="<<x2<<endl;elseif(d==0)cout<<"x1=x2="<<x1<<endl;else{cout<<"x1="<<x1<<"+"<<x2<<"i"<<endl;cout<<"x1="<<x1<<"-"<<x2<<"i"<<endl;}}第七十八頁,共一百一十一頁,編輯于2023年,星期四4、建立find.cpp文件,設(shè)計主函數(shù),輸入方程系數(shù),并求解。包含equation.h頭文件#include"equation.h"voidread(float&,float&,float&);voidmain(){floata,b,c;cout<<"這是一個求一元二次方程的跟的程序:"<<endl;do{ read(a,b,c); if(a==0)break; Findrootobj(a,b,c); obj.find(); obj.show();}while(a!=0);}voidread(float&a,float&b,float&c){ cout<<"請輸入方程的系數(shù):"<<endl; cout<<"a:";cin>>a; if(a==0)return; cout<<"b:";cin>>b; cout<<"c:";cin>>c;}第七十九頁,共一百一十一頁,編輯于2023年,星期四作業(yè)課本125頁:改錯題第2題完成程序題編程題第3題課本126頁:編程題第3題第八十頁,共一百一十一頁,編輯于2023年,星期四構(gòu)造函數(shù)定義:classA{intapublic:

A(intx):a(x){}A(intx){a=x;}}const限定的數(shù)據(jù)成員初始化必須用?形式?還有什么數(shù)據(jù)成員必須用此種形式初始化??const限定的數(shù)據(jù)成員和引用數(shù)據(jù)成員初始化必須使用初始化列表形式。第五章復(fù)習(xí)

第八十一頁,共一百一十一頁,編輯于2023年,星期四靜態(tài)成員不依賴于對象而存在。靜態(tài)數(shù)據(jù)成員:定義時加static靜態(tài)數(shù)據(jù)成員必須初始化使用語句:intA::b=0;靜態(tài)對象:static對象一旦定義存在于內(nèi)存中,直到程序結(jié)束才釋放內(nèi)存。第八十二頁,共一百一十一頁,編輯于2023年,星期四靜態(tài)成員不依賴于對象而存在。靜態(tài)成員使用注意:非靜態(tài)對象靜態(tài)成員可否使用?靜態(tài)對象靜態(tài)成員可否使用?靜態(tài)對象非靜態(tài)成員可否使用?靜態(tài)成員函數(shù)非靜態(tài)成員可否使用?非靜態(tài)成員函數(shù)靜態(tài)成員可否使用?通過類如何使用靜態(tài)公有成員?第八十三頁,共一百一十一頁,編輯于2023年,星期四靜態(tài)成員不依賴于對象而存在。其他注意事項:p1081-7靜態(tài)函數(shù)沒有this指針不能聲明為virtual函數(shù)第八十四頁,共一百一十一頁,編輯于2023年,星期四友元普通函數(shù)作友元類的成員函數(shù)作友元類作友元類A的友元(函數(shù),成員函數(shù),類)可以訪問類A中的所有成員,但必須通過對象引用指針來訪問。友元應(yīng)在類A中利用friend聲明第八十五頁,共一百一十一頁,編輯于2023年,星期四const對象const數(shù)據(jù)成員const成員函數(shù)const指針const變量const引用加const限定后不可改變,任何企圖改變都導(dǎo)致錯誤,并應(yīng)注意他們的初始化!!第八十六頁,共一百一十一頁,編輯于2023年,星期四使用規(guī)則:const對象不能調(diào)用任何非const成員函數(shù)const成員函數(shù)只能調(diào)用const成員函數(shù)非const對象可以調(diào)用const成員函數(shù)非const對象可以使用const數(shù)據(jù)成員const成員函數(shù)中不能使用任何試圖改變變量值的語句。const數(shù)據(jù)成員必須在構(gòu)造函數(shù)的初始化列表中進行初始化第八十七頁,共一百一十一頁,編輯于2023年,星期四數(shù)組和類類可以定義對象數(shù)組對象數(shù)組中的每個元素都是對象,其使用方式和對象的使用方式相同。對象數(shù)組初始化形式:

類名數(shù)組名={類名(參數(shù)).....};對象數(shù)組名表示數(shù)組的首地址可以定義指向?qū)ο蟮闹羔榩使其指向某個對象可以用指針p指向數(shù)組中的元素第八十八頁,共一百一十一頁,編輯于2023年,星期四定義指針數(shù)組int*p[5];表示該數(shù)組中的5個元素均為指針。函數(shù)指針定義形式:int(*p)(int,int);int(A::*P)(int,int);intmax(inta,intb){}intA::max(inta,intb){}第八十九頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-1第九十頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-1第九十一頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-1第九十二頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-1第九十三頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-1第九十四頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-4第九十五頁,共一百一十一頁,編輯于2023年,星期四習(xí)題五-4第九十六頁,共一百一十一頁,編輯于2023年,星期四真題17.35.簡單成員函數(shù)是指聲明中不含const、______和static關(guān)鍵字的函數(shù)。第九十七頁,共一百一十一頁,編輯于2023年,星期四真題

32.友元函數(shù)可以存取類的_______、公有成員和保護成員。第九十八頁,共一百一十一頁,編輯于2023年,星期四真題

39.在C++中,雖然友元提供了類之間數(shù)據(jù)進行訪問的一種方式,但它破壞了面向?qū)ο蟪绦蛟O(shè)計的_______特性。18.關(guān)于類的靜態(tài)成員函數(shù)描述

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論