吉大課件C程序結(jié)構(gòu).ppt
《吉大課件C程序結(jié)構(gòu).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《吉大課件C程序結(jié)構(gòu).ppt(69頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、-1-,C++ProgrammingLanguage,Dr.ZhengXiaojuanAssociateProfessorSoftwareCollegeofNortheastNormalUniversityOctober.2008,-2-,第五章程序結(jié)構(gòu),-3-,本章內(nèi)容,作用域與可見(jiàn)性生存期局部對(duì)象和全局對(duì)象靜態(tài)成員友元常類型編譯預(yù)處理,-4-,類本身可被定義在三種作用域內(nèi):1.全局作用域。全局類,絕大多數(shù)的C++類是定義在該作用域中,我們?cè)谇懊娑x的所有類都是在全局作用域中。2.在另一個(gè)類的作用域中。嵌套類,即一個(gè)類包含在另一個(gè)類中。3.在一個(gè)塊的局部作用域中。局部類,該類完全被塊包含。,
2、1作用域與可見(jiàn)性,-5-,2生存期,2.1靜態(tài)生存期1.定義:與程序的運(yùn)行期相同。靜態(tài)生存期的變量程序開(kāi)始運(yùn)行就存在,直到程序運(yùn)行結(jié)束生存期結(jié)束。具有文件作用域的變量具有靜態(tài)生存期。2.語(yǔ)法聲明:static。例如,staticintk;3.分配空間:在固定的數(shù)據(jù)區(qū)域內(nèi)分配空間。4.初始化:如果具有靜態(tài)生存期的變量未初始化,則自動(dòng)初始化為0。5.靜態(tài)變量種類:全局變量、靜態(tài)局部變量。,-6-,運(yùn)行時(shí)的存儲(chǔ)空間結(jié)構(gòu),目標(biāo)代碼空間,寄存器空間,靜態(tài)區(qū)空間,堆區(qū)空間棧區(qū)空間,,,,,,,,最大地址,最小地址,,,,,-7-,2.2局部生存期1.定義:在塊作用域中聲明的變量具有局部生存期。此生存期誕生
3、于聲明點(diǎn),而終止于其作用域的結(jié)束處。2.局部變量種類:具有局部生存期的變量,具有塊作用域。塊作用域內(nèi)靜態(tài)變量,具有靜態(tài)生存期。例如:voidmain()staticintk;//...,,-8-,2.3動(dòng)態(tài)生存期定義:由程序中特定的函數(shù)(malloc()和free())調(diào)用或由操作符(new和delete)創(chuàng)建和釋放。具有動(dòng)態(tài)生存期的變量在內(nèi)存的堆區(qū)分配空間。,-9-,#includeclassClockprivate:intHour,Minute,Second;public:Clock()Hour=0;Minute=0;Second=0;,3局部對(duì)象和全局對(duì)象,-10-,voidSetTim
4、e(intNewH,intNewM,intNewS);voidShowTime();Clock();voidClock::SetTime(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;voidClock::ShowTime()cout< 5、kmyclock(globClock);cout< 6、tmain()cout<
7、變量,有全局壽命,局部可見(jiàn)。intb=-10;//b,c為局部變量,具有動(dòng)態(tài)生存期。intc=0;voidother(void);cout<<---MAIN---n;cout< 8、化。intc=10;//C為局部變量,具有動(dòng)態(tài)生存期,//每次進(jìn)入函數(shù)時(shí)都初始化。a=a+2;i=i+32;c=c+5;cout<<---OTHER---n;cout< 9、態(tài)成員,-19-,4.1靜態(tài)數(shù)據(jù)成員類的普通數(shù)據(jù)成員:類的靜態(tài)數(shù)據(jù)成員:,在類的每一個(gè)對(duì)象中都擁有一個(gè)拷貝,每個(gè)對(duì)象的同名數(shù)據(jù)成員可以分別存儲(chǔ)不同的數(shù)值,這也是每個(gè)對(duì)象擁有自身特征的保證。,是類的數(shù)據(jù)成員的一種特例。每個(gè)類只有一個(gè)靜態(tài)數(shù)據(jù)成員拷貝,它由該類的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同一個(gè)類的不同對(duì)象之間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。,,-20-,2.應(yīng)用要點(diǎn):(1)聲明:加static關(guān)鍵字說(shuō)明。例如:staticintn(2)初始化:在定義時(shí)初始化,且必須在類和所有的成員函數(shù)之外,與全局變量初始化的方法一樣。不能在構(gòu)造函數(shù)中初始化。因?yàn)殪o態(tài)數(shù)據(jù)成員在構(gòu)造函數(shù)被調(diào)用之前就已 10、經(jīng)存在了。形式:::=例如:intpoint::n=0;(3)引用:靜態(tài)數(shù)據(jù)成員屬于類,而不屬于任何一個(gè)對(duì)象,所以,在類外通過(guò)類名對(duì)它進(jìn)行引用。一般形式如下:::;,-21-,(4)靜態(tài)數(shù)據(jù)成員訪問(wèn)控制限制:private/protected:只能在類內(nèi)通過(guò)公有的靜態(tài)成員函數(shù)訪問(wèn),在類外無(wú)法引用。public:可以采用“類名::成員名”或“對(duì)象名.成員名”訪問(wèn)。,,-22-,【例4】含有靜態(tài)數(shù)據(jù)成員。#includeclassTestprivate:intk;public:staticintn;Test(intkk)k=kk;n++;voidDisplay()cout< 11、k< 12、idmain()Testt1(10),t2(20);t1.Display();t2.Display();Test::n++;t2.Display();程序運(yùn)行結(jié)果?,-25-,4.2靜態(tài)函數(shù)成員1.定義:使用static關(guān)鍵字聲明的函數(shù)成員。同靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)函數(shù)成員也屬于整個(gè)類,由同一個(gè)類的所有對(duì)象共同維護(hù),為這些對(duì)象所共享。2.靜態(tài)成員函數(shù)如何訪問(wèn)成員數(shù)據(jù):靜態(tài)的成員函數(shù)沒(méi)有this指針(1)訪問(wèn)靜態(tài)成員數(shù)據(jù),可以直接使用其變量名來(lái)訪問(wèn);(2)訪問(wèn)非靜態(tài)成員數(shù)據(jù),需要使用“對(duì)象名.成員名”;3.公有的、靜態(tài)的成員函數(shù)在類外的調(diào)用方式:類名::成員函數(shù)名(實(shí)參表)4.允許用對(duì)象調(diào)用靜態(tài) 13、的成員函數(shù)。,-26-,【例5】使用靜態(tài)函數(shù)成員。#includeclassMpublic:M(inta)A=a;B+=a;staticvoidf1(Mm);private:intA;staticintB;;,voidM::f1(Mm)cout<<“A=“< 14、te:intx;public:staticvoidf(Aa);;voidA::f(Aa)cout< 15、t_x()<<,< 16、非成員函數(shù)對(duì)它訪問(wèn),但在某些場(chǎng)合下,非成員函數(shù)體中需要通過(guò)對(duì)象名訪問(wèn)private成員,這可以通過(guò)友元函數(shù)來(lái)實(shí)現(xiàn)。(2)有些函數(shù)需要放在外面或者類設(shè)計(jì)完后補(bǔ)充的,而不能成為成員函數(shù),但是又需要訪問(wèn)類中的私有成員。3.作用:實(shí)現(xiàn)直接訪問(wèn)數(shù)據(jù)。,-31-,5.1友元函數(shù)1.定義:如果友元是普通函數(shù)或類的成員函數(shù),則稱為友元函數(shù)。友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾的非成員函數(shù)。2.語(yǔ)法:(1)普通函數(shù)聲明為友元函數(shù)的形式:friend(參數(shù)表)(2)成員函數(shù)聲明為友元函數(shù)的形式:friend::(參數(shù)表),-32-,3.應(yīng)用要點(diǎn):(1)友元函數(shù)的聲明可以在類聲明中的任何位置,既可在publ 17、ic區(qū),也可在protected區(qū),意義完全一樣。(2)友元函數(shù)的定義一般放在類的外部,最好與類的其它成員函數(shù)定義放在一起。如果是普通函數(shù)作為友元,也可以放在類中。(3)友元函數(shù)不是本類的成員函數(shù),但是它可以通過(guò)對(duì)象名訪問(wèn)類的所有成員,包括私有和保護(hù)成員。(4)要慎用友元。,-33-,【例】普通函數(shù)作友元函數(shù)。#include#includeclasspointprivate:doublex,y;public:point(doublexx=0,doubleyy=0)x=xx;y=yy;doubleget_x()returnx;doubleget_y()returny;frienddoubled 18、istance(point,-34-,doubledistance(point,-35-,【例】成員函數(shù)作友元函數(shù)。#include#includeclasspoint;//前向聲明point類classApublic:doubledistance(point,-36-,public:point(doublexx=0,doubleyy=0)x=xx;y=yy;doubleget_x()returnx;doubleget_y()returny;frienddoubleA::distance(point,-37-,voidmain()pointmyp1(1,1),myp2(4,5);Aobj;// 19、聲明一個(gè)A類的對(duì)象cout< 20、便性折中,,,,-39-,5.2友元類1.如果友元是一個(gè)類,則稱為友元類。2.語(yǔ)法聲明形式:friendclass3.應(yīng)用要點(diǎn):(1)友元類的聲明同樣可以在類聲明中的任何位置。(2)友元類的所有成員函數(shù)都成為友元函數(shù)。例如,若A類為B類的友元類,則A類的所有成員函數(shù)都是B類的友元函數(shù),都可以訪問(wèn)B類的私有和保護(hù)成員。,-40-,用友元類的方法重做例8。#include#includeclasspoint;//前向聲明point類classApublic:doubledistance(pointclasspoint,-41-,private:doublex,y;public:point(doub 21、lexx=0,doubleyy=0)x=xx;y=yy;doubleget_x()returnx;doubleget_y()returny;friendclassA;//A類為友元類;doubleA::distance(point,-42-,voidmain()pointmyp1(1,1),myp2(4,5);Aobj;//必須聲明一個(gè)A類的對(duì)象cout< 22、類是B類的友元,C類和A類之間如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。友無(wú)關(guān)系是單向的。如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問(wèn)A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問(wèn)B類的私有和保護(hù)數(shù)據(jù)。,-44-,1.功能:類型修飾符,左結(jié)合。用來(lái)凍結(jié)一個(gè)變量的值,使其值在程序中不能被進(jìn)一步改變(置成只讀屬性,即變?yōu)槌A浚?.定義:const類型定義符變量名=初值;(當(dāng)T是一個(gè)簡(jiǎn)單數(shù)據(jù)類型時(shí)Tconst=constT)例如:constintsumValue=10;(或intconstsumValue=10;)3.應(yīng)用要點(diǎn):(1)替代C中的預(yù)處理命令#define,但比它更加 23、語(yǔ)義精確,因?yàn)?define無(wú)法反映常量的數(shù)據(jù)類型。如:#definesumValue=10//此時(shí)的sumValue是char型還是int型,6常類型(const),-45-,(2)對(duì)變量經(jīng)const修飾后,必須給變量賦初值(但函數(shù)的形參不需賦初值),一經(jīng)const修飾后便不能修改此變量之值constintsumValue=10;sumValue=0;//錯(cuò)誤voidDisplay(constint*a,intn)cout< 24、向常對(duì)象的指針變量:constint*p=p0=2.,constint*pint*constp=,,-47-,()C++視const修飾的符號(hào)名為常量特性,因而它可以用于任何可能出現(xiàn)數(shù)字常量的場(chǎng)合(如數(shù)組的大小的說(shuō)明等).constintArraySize=10;chararrayArraySize;()由于C++視const修飾的符號(hào)名為常量特性,因而并不對(duì)它實(shí)際分配內(nèi)存空間constintsumValue=10;//不實(shí)際分配內(nèi)存空間intsumValue=10;//實(shí)際分配內(nèi)存空間(兩個(gè)字節(jié))()#define所定義的符號(hào)名為全局性常量,因而在整個(gè)程序中應(yīng)保持唯一性;而const可以說(shuō)明 25、一個(gè)局部或全局性同名常量(據(jù)此可以改變const符號(hào)名之值),-48-,#defineMin1constintMax=100voidmain(void)#defineMin2//錯(cuò)誤,不能再定義同名常量constintMax=200//可以再定義同名局部常量,-49-,7.1常引用定義:使用const關(guān)鍵字聲明的引用稱為常引用。常引用所引用的對(duì)象不能被更新。語(yǔ)法:常引用的聲明形式:constconstint這段程序編譯時(shí)有兩個(gè)錯(cuò)誤:errorC2530:m:referencesmustbeinitializederrorC2166:l-valuespecifiesconstobject,-51 26、-,將上述程序稍作修改,#includevoidmain()intn=5;constint這時(shí),程序運(yùn)行結(jié)果為m=5,-52-,【例10】常引用作形參。#includevoiddisplay(constdoubleerrorC2166:l-valuespecifiesconstobject,常引用做形參時(shí),函數(shù)不能更新r所引用的對(duì)象,因此,對(duì)應(yīng)的實(shí)參就不會(huì)被破壞。,-53-,7.2常對(duì)象定義:使用const關(guān)鍵字聲明的對(duì)象稱為常對(duì)象。語(yǔ)法:常對(duì)象的聲明形式:const或const聲明常對(duì)象的同時(shí),也要進(jìn)行初始化,而且該對(duì)象以后不能再被更新。classAprivate:intx,y;,-54-, 27、public:A(inti=0,intj=0)x=i;y=j;//...;Acobj1;Aconstcobj2(3,4);cobj1.print();cobj2.print();X//...errorC2662:print:cannotconvertthispointerfromconstclassAtoclassA3目的:const成員函數(shù)表示該成員函數(shù)只能讀類數(shù)據(jù)成員,而不能修改類成員數(shù)據(jù)。即在不改變對(duì)象的成員函數(shù)的函數(shù)原型中加上const說(shuō)明。可提高程序的可讀性。還能提高程序的可靠性,已定義成const的成員函數(shù),一旦企圖修改數(shù)據(jù)成員的值,則編譯器按錯(cuò)誤處理。4應(yīng)用要點(diǎn):const是加在 28、函數(shù)聲明后面的類型修飾符,它是函數(shù)類型的一個(gè)組成部分,因此,在實(shí)現(xiàn)部分也要帶const關(guān)鍵字。,如果將const放在函數(shù)聲明前意味著函數(shù)的返回值是常量,意義完全不同。,-56-,const關(guān)鍵字可以被用于對(duì)重載函數(shù)的區(qū)分。例如,可以在類中這樣聲明:voidfun();voidfun()const;常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中沒(méi)有用const修飾的成員函數(shù)。如果將一個(gè)對(duì)象說(shuō)明為常對(duì)象,則通過(guò)該對(duì)象只能調(diào)用它的常成員函數(shù),而不能調(diào)用其它成員函數(shù)。在C++中,const對(duì)象只能調(diào)用const成員函數(shù),-57-,【例11】常成員函數(shù)。#includeclassAprivate:i 29、ntx,y;public:A(inti=0,intj=0)x=i;y=j;voidfun()//成員函數(shù)cout<<成員函數(shù):x=< 30、常數(shù)據(jù)成員1.定義:使用關(guān)鍵字const說(shuō)明的數(shù)據(jù)成員。包括常引用、常對(duì)象等,常數(shù)據(jù)成員不能被更新.2.初始化:用成員初始化列表的方式通過(guò)構(gòu)造函數(shù)對(duì)該數(shù)據(jù)成員進(jìn)行初始化。,-60-,【例12】常數(shù)據(jù)成員。#includeclassAprivate:constintx;//常數(shù)據(jù)成員staticconstinty;//靜態(tài)常數(shù)據(jù)成員public:constint//常引用,本程序有三個(gè)常數(shù)據(jù)成員,-61-,A(inti):x(i),r(x)//常數(shù)據(jù)成員通過(guò)初始化列表獲得初值voidfun()cout< 31、靜態(tài)常數(shù)據(jù)成員的初始化voidmain()Aobj1(1),obj2(2);obj1.fun();obj2.fun();,程序運(yùn)行結(jié)果為:x=1,y=5,r=1x=2,y=5,r=2,-62-,編譯預(yù)處理,1.定義:預(yù)處理程序又稱為預(yù)處理器,它包含在編譯器中。預(yù)處理程序提供了一組編譯預(yù)處理指令和預(yù)處理操作符。編譯器在對(duì)源程序進(jìn)行編譯之前,首先要由預(yù)處理程序?qū)Τ绦蛭谋具M(jìn)行預(yù)處理,然后編譯器接受預(yù)處理程序的輸出,并將源代碼轉(zhuǎn)化成用機(jī)器語(yǔ)言編寫的目標(biāo)文件。預(yù)處理指令實(shí)際上不是C++語(yǔ)言的一部分,它只是用來(lái)擴(kuò)充C++程序設(shè)計(jì)的環(huán)境。,-63-,需預(yù)處理的源程序,,預(yù)處理器,,源程序,,編譯程序,,目標(biāo) 32、匯編程序,,匯編程序,,可重定位的目標(biāo)代碼,,連接/裝配程序,,絕對(duì)目標(biāo)代碼,高級(jí)語(yǔ)言程序到可執(zhí)行代碼的轉(zhuǎn)換過(guò)程,-64-,2.使用預(yù)處理指令需要注意以下幾點(diǎn):所有的預(yù)處理指令在程序中都是以“#”來(lái)引導(dǎo)。每一條預(yù)處理指令單獨(dú)占用一行,不需要用分號(hào)結(jié)束。預(yù)處理指令可以根據(jù)需要出現(xiàn)在程序中的任何位置。3.預(yù)處理指令:,-65-,(1)#include指令1)定義:#include指令也稱文件包含指令,其作用是將另一個(gè)源文件嵌入到當(dāng)前源文件中該點(diǎn)處。2)語(yǔ)法及功能:格式1:#include功能:按標(biāo)準(zhǔn)方式搜索C++系統(tǒng)目錄下的include子目錄。格式2:#include“文件名”功能:首先在當(dāng)前目 33、錄中搜索,若沒(méi)有,再按標(biāo)準(zhǔn)方式搜索。,-66-,(2)#define和#undef指令1)定義:C,#define符號(hào)常量帶參數(shù)的宏。#definePI3.14//定義了一個(gè)符號(hào)常量PI#defineMAX(a,b)((a)(b)?(a):(b))//定義一個(gè)帶參數(shù)的宏MAX(a,b)仍可這樣定義被const替代inline內(nèi)嵌函數(shù)#undef的作用是刪除由#define定義的宏,使之不再起作用。,,,C++,,,-67-,(3)條件編譯指令1)定義:限定程序中的某些內(nèi)容要在滿足一定條件的情況下才參與編譯。利用條件編譯可以使同一個(gè)源程序在不同的編譯條件下產(chǎn)生不同的目標(biāo)代碼。2)語(yǔ)法:形式1:# 34、ifdef標(biāo)識(shí)符程序段1#else程序段2#endif,如果“標(biāo)識(shí)符”已經(jīng)定義過(guò),則編譯程序段1,否則編譯程序段2;如果沒(méi)有程序段2,則#else可以省略。,-68-,形式2:#ifndef標(biāo)識(shí)符程序段1#else程序段2#endif例:#ifndefMYHEAD_H#defineMYHEAD_H#endif本段代碼能夠保證符號(hào)MYHEAD_H只有一次定義。,如果“標(biāo)識(shí)符”未被定義過(guò),則編譯程序段1,否則編譯程序段2;如果沒(méi)有程序段2,則#else可以省略。,-69-,由于文件包含指令可以嵌套使用,在設(shè)計(jì)程序時(shí)要避免多次重復(fù)包含統(tǒng)一個(gè)頭文件,否則會(huì)引起變量及類的重復(fù)定義。,//main.cpp#include“file1.h”#include“file2.h”intmain()//file1.h#include“head.h”//file2.h#include“head.h”//head.hclasspoint,//head.h#ifndefHEAD_H#defineHEAD_HClassPoint#enddif,
- 溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國(guó)人民警察節(jié)(筑牢忠誠(chéng)警魂感受別樣警彩)
- 2025正字當(dāng)頭廉字入心爭(zhēng)當(dāng)公安隊(duì)伍鐵軍
- XX國(guó)企干部警示教育片觀后感筑牢信仰之基堅(jiān)守廉潔底線
- 2025做擔(dān)當(dāng)時(shí)代大任的中國(guó)青年P(guān)PT青年思想教育微黨課
- 2025新年工作部署會(huì)圍繞六個(gè)干字提要求
- XX地區(qū)中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 支部書(shū)記上黨課筑牢清廉信念為高質(zhì)量發(fā)展?fàn)I造風(fēng)清氣正的環(huán)境
- 冬季消防安全知識(shí)培訓(xùn)冬季用電防火安全
- 2025加強(qiáng)政治引領(lǐng)(政治引領(lǐng)是現(xiàn)代政黨的重要功能)
- 主播直播培訓(xùn)直播技巧與方法
- 2025六廉六進(jìn)持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個(gè)人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領(lǐng)鄉(xiāng)村振興工作總結(jié)
- XX中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 幼兒園期末家長(zhǎng)會(huì)長(zhǎng)長(zhǎng)的路慢慢地走