




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章C++程序的結構1本章主要內容作用域與可見性對象的生存期數據與函數靜態成員2友元共享數據的保護編譯預處理命令多文件結構和工程1、塊作用域在塊中聲明的標識符,其作用域自聲明處起,限于塊中,例如:voidfun(inta){intb(a);cin>>b;if(b>0){intc;......}}c的作用域b的作用域5.1作用域與可見性2、類作用域(1)類作用域作用于特定的成員名;(2)類X的成員M具有類作用域,對M的訪問方式如下:如果在X的成員函數中沒有聲明同名的局部作用域標識符,那么在該函數內可以訪問成員M。如果存在,可以通過表達式X::M訪問。5.1作用域與可見性3、文件作用域在類外定義的變量,其作用于整個程序文件中。5.1作用域與可見性4、可見性(1)可見性是從對標識符的引用的角度來談的概念(2)可見性表示從內層作用域向外層作用域“看”時能看見什么。(3)如果標識在某處可見,則就可以在該處引用此標識符。5.1作用域與可見性4、可見性塊作用域類作用域文件作用域5.1作用域與可見性4、可見性(1)標識符應聲明在先,引用在后;(2)如果某個標識符在外層中聲明,且在內層中沒有同一標識符的聲明,則該標識符在內層可見;(3)對于兩個嵌套的作用域,如果在內層作用域內聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內層不可見。5.1作用域與可見性5、同一作用域中的同名標識符重載的函數可以有相同的函數名。5.1作用域與可見性5.2對象的生存期對象從產生到結束的這段時間就是它的生存期。在對象生存期內,對象將保持它的值,直到被更新為止。1、靜態生存期(1)生存期與程序的運行期相同;(2)在文件作用域中聲明的對象具有這種生存期。(3)在函數內部聲明靜態生存期對象,要冠以關鍵字static。5.2對象的生存期#include<iostream>usingnamespacestd;inti=5;//文件作用域intmain(){cout<<"i="<<i<<endl;return0;}i具有靜態生存期例5.2對象的生存期2、動態生存期(1)塊作用域中聲明的,沒有用static修飾的對象是動態生存期的對象(習慣稱局部生存期對象)。(2)開始于程序執行到聲明點時,結束于命名該標識符的作用域結束處。5.2對象的生存期#include<iostream>usingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){staticinta=1;inti=5;a++;i++;cout<<"i="<<i<<",a="<<a<<endl;}運行結果:i=6,a=2i=6,a=3i是動態生存期a是靜態生存期5.2對象的生存期例5-3具有靜態、動態生存期對象的時鐘程序#include<iostream>usingnamespacestd;classClock //時鐘類聲明{public: //外部接口
Clock(); voidSetTime(intNewH,intNewM,intNewS);//三個形參均具有函數原型作用域
voidShowTime(); ~Clock(){}private: //私有數據成員
intHour,Minute,Second;};//時鐘類成員函數實現Clock::Clock() //構造函數{ Hour=0; Minute=0; Second=0;}20例5-3具有靜態、動態生存期對象的時鐘程序//時鐘類成員函數實現voidClock::SetTime(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}voidClock::ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}20例5-3具有靜態、動態生存期對象的時鐘程序ClockglobClock; //聲明對象globClock,
//具有靜態生存期,文件作用域intmain() //主函數{cout<<"Firsttimeoutput:"<<endl; //引用具有文件作用域的對象:
globClock.ShowTime();//對象的成員函數具有類作用域
globClock.SetTime(8,30,30); ClockmyClock(globClock);//聲明具有塊作用域的對象myClock cout<<"Secondtimeoutput:"<<endl; myClock.ShowTime(); //引用具有塊作用域的對象}21例5-3具有靜態、動態生存期對象的時鐘程序程序的運行結果為:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022例5-3具有靜態、動態生存期對象的時鐘程序5.3數據與函數1、數據與函數關系(1)數據存儲在局部對象中,通過參數傳遞實現共享——函數間的參數傳遞;(2)數據存儲在全局對象中;(3)將數據和使用數據的函數封裝在類中。2、使用全局對象#include<iostream>usingnamespacestd;intglobal;voidf(){global=5;}voidg(){cout<<global<<endl;}intmain(){f();g();//輸出“5”return0;}5.3數據與函數3、將函數與數據封裝#include<iostream>usingnamespacestd;classApplication{public:voidf();voidg();private:intglobal;};voidApplication::f(){global=5;}voidApplication::g(){cout<<global<<endl;}intmain(){ApplicationMyApp;MyApp.f();MyApp.g();return0;}5.3數據與函數1、靜態數據成員(1)用關鍵字static聲明(2)該類的所有對象維護該成員的同一個拷貝(3)必須在類外定義和初始化,用(::)來指明所屬的類。5.4靜態成員靜態數據成員的初始化是在()中進行的。構造函數A任何成員函數B所屬類C全局區D提交單選題1分2、靜態成員函數(1)類外代碼可以使用類名和作用域操作符來調用靜態成員函數;(2)靜態成員函數只能引用屬于該類的靜態數據成員或靜態成員函數,不能直接引用一般成員變量。5.4靜態成員靜態成員函數對類的數據成員訪問()。是不允許的A只允許是靜態數據成員B只允許是非靜態數據成員C可允許是靜態數據成員或非靜態數據成員D提交單選題1分非靜態成員函數訪問的類的數據成員()。可以是非靜態數據成員或靜態數據成員A不可能是類的靜態數據成員B只能是類的非靜態數據成員C只能是類的靜態數據成員D提交單選題1分例5-4
具有靜態數據成員的Point類#include<iostream>usingnamespacestd;classPoint {public: Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} voidGetC(){cout<<"Objectid="<<countP<<endl;}private: intX,Y; staticintcountP;};一個類的靜態數據成員所表示屬性()。是類的或對象的屬性A只是對象的屬性B只是類的屬性C類和友元的屬性D提交單選題1分Point::Point(Point&p){ X=p.X; Y=p.Y; countP++;}intPoint::countP=0;intmain() { PointA(4,5); cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); A.GetC(); PointB(A); cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); B.GetC(); }28例5-4
具有靜態數據成員的Point類靜態成員函數舉例#include<iostream>usingnamespacestd;classApplication{public:staticvoidf();staticvoidg();private:staticintglobal;inta;};intApplication::global=0;voidApplication::f(){global=5;inta;}voidApplication::g(){cout<<global<<endl;}intmain(){Application::f();Application::g();return0;}靜態成員函數舉例classA{public:staticvoidf(Aa);private:intx;};voidA::f(Aa){cout<<x;//對x的引用是錯誤的,不能直接
cout<<a.x;//正確,可以引用對象中的私有數據成員}注意:靜態成員函數不能直接訪問非靜態成員變量,但可以通過對象訪問非靜態成員下列關于靜態成員函數的說法中不正確的是()靜態成員函數不屬于對象成員A對靜態成員函數的引用不需要使用對象名B靜態成員函數中可以直接引用類的非靜態成員C靜態成員函數中可以直接引用類的靜態成員D提交單選題1分下面對靜態數據成員的描述中,正確的是()靜態數據成員可以在類體內進行初始化A靜態數據成員不可以被類的對象調用B靜態數據成員不受private控制符的限制C靜態數據成員可以直接用類名調用D提交單選題1分具有靜態數據、函數成員的Point類#include<iostream>usingnamespacestd;classPoint //Point類聲明{public: //外部接口
Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;} Point(Point&p); //拷貝構造函數
intGetX(){returnX;} intGetY(){returnY;}
staticvoidGetC(){cout<<"Objectid="<<countP<<endl;} private: //私有數據成員
intX,Y;
staticintcountP;}Point::Point(Point&p){ X=p.X; Y=p.Y; countP++;}intPoint::countP=0; intmain() //主函數實現{ PointA(4,5); //聲明對象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY();
A.GetC(); //輸出對象號,對象名引用
PointB(A); //聲明對象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY();
Point::GetC(); //輸出對象號,類名引用}32具有靜態數據、函數成員的Point類類的靜態成員的訪問控制()。只允許被定義為privateA只允許被定義為private或protectedB只允許被定義為publicC可允許被定義為private、protected或publicD提交單選題1分5.5友元1、友元特征(1)友元是C++提供的一種破壞數據封裝和數據隱藏的機制。(2)通過將一個模塊聲明為另一個模塊的友元,前一個模塊能夠引用到另一個模塊中本是被隱藏的信息。5.5友元1、友元特征(3)可以使用友元函數和友元類。(4)為了確保數據的完整性,及數據封裝與隱藏的原則,建議盡量不使用或少使用友元。下面對于友元函數描述正確的是()友元函數的實現必須在類的內部定義A友元函數是類的成員函數B友元函數破壞了類的封裝性和隱藏性C友元函數不能訪問類的保護成員D提交單選題1分引入友元的主要目的是為了()。增強數據安全性A提高程序的可靠性B提高程序的效率和靈活性C保證類的封裝性D提交單選題1分2、友元函數友元函數是在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中能夠通過對象名訪問private和protected成員,友元函數不能直接訪問所在類的private和protected成員。
區別:類的成員函數能夠直接訪問類的所有成員。5.5友元2、友元函數(1)作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇;(2)訪問對象中的成員必須通過對象名;(3)友元函數在作用域方面類似于全局函數。5.5友元下列關于友元函數的說法中不正確的是()友元函數可以是一個普通函數,也可以是其它類的成員函數A友元函數不是類的成員函數B友元函數可以直接訪問類的所有成員C友元函數不受訪問控制符的限制D提交單選題1分當將一個類A或函數f()說明為另一個類B的友元后,類A或函數f()能夠直接訪問類B的()。只能是公有成員A只能是保護成員B只能是除私有成員之外的任何成員C通過B類對象可訪問具有任何權限的成員D提交單選題1分例5-6使用友元函數計算兩點距離#include<iostream>#include<cmath>usingnamespacestd;classPoint //Point類聲明{public: //外部接口
Point(intxx=0,intyy=0){X=xx;Y=yy;} intGetX(){returnX;} intGetY(){returnY;}
friendfloatDistance(Point&a,Point&b);private: //私有數據成員
intX,Y;};doubleDistance(Point&a,Point&b){doubledx=a.X-b.X;doubledy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);}intmain(){Pointp1(3.0,5.0),p2(4.0,6.0);doubled=Distance(p1,p2);cout<<"Thedistanceis"<<d<<endl;return0;}36例5-6使用友元函數計算兩點距離C++語言中提供的()不是類的成員,但具有類成員的特權。構造函數A友元函數B虛函數C重載函數D提交單選題1分2、友元類(1)若一個類為另一個類的友元,則此(第一個)類的所有成員都能訪問對方類的所有成員。(同樣需要通過對象引用對方類成員)。(2)聲明語法:將友元類名在另一個類中使用friend修飾說明。5.5友元友元類舉例classA{friendclassB;//B是A的友元類public:voidDisplay(){cout<<x<<endl;}private:intx;}classB{public:voidSet(inti);voidDisplay();private:Aa;};voidB::Set(inti){a.x=i;}voidB::Display(){a.Display();}39友元類舉例4、友元關系是單向的如果聲明B類是A類的友元,B類的成員函數就可以訪問A類的私有和保護數據,但A類的成員函數卻不能訪問B類的私有、保護數據。5.5友元下列關于友元的說法中不正確的是()友元破壞了類的封裝性和信息隱藏性A友元類的所有成員函數都可以直接訪問類的成員B友元關系不能傳遞C友元關系是單向的D提交單選題1分下列有關一個類的友元函數的敘述中,正確的()允許在類外訪問類中除私有成員以外的所有成員A允許在類外訪問類中的任何成員B友元也是該類的成員C友元的聲明必須被放在該類的公有部分D提交單選題1分1、常類型
常類型的對象必須進行初始化,而且不能被更新。(1)常引用:被引用的對象不能被更新。const
類型說明符&引用名(2)常對象:必須進行初始化,不能被更新。類名const
對象名5.6共享數據的保護1、常類型(3)常數組:數組元素不能被更新(下一章介紹)。類型說明符const數組名[大小]...(4)常指針:指向常量的指針(下一章介紹)。5.6共享數據的保護例5-7常引用做形參#include<iostream>usingnamespacestd;voiddisplay(constdouble&r);intmain(){doubled(9.5);display(d);return0;}voiddisplay(constdouble&r)//常引用做形參,在函數中不能更新r所引用的對象。{cout<<r<<endl;}常對象舉例classA{public:A(inti,intj){x=i;y=j;}...private:intx,y;};Aconsta(3,4);//a是常對象,不能被更新2、用const修飾的對象成員(1)常成員函數使用const關鍵字說明的函數。常成員函數不能更新對象的數據成員。const關鍵字可以被用于參與對重載函數的區分(第三種重載方式)5.6共享數據的保護2、用const修飾的對象成員(1)常成員函數常成員函數說明格式:
類型說明符函數名(參數表)const;
const是函數類型的一個組成部分,因此在實現部分也要帶const關鍵字。5.6共享數據的保護2、用const修飾的對象成員(2)通過常對象只能調用它的常成員函數。(3)常數據成員使用const說明的數據成員。5.6共享數據的保護對于常數據成員,下面的描述正確的是()常數據成員可以不初始化,并且不能更新A常數據成員必須被初始化,并且不能更新B常數據成員可以不初始化,并且可以被更新C常數據成員必須被初始化,并且可以被更新D提交單選題1分例5-8常成員函數舉例#include<iostream>usingnamespacestd;classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidprint();voidprint()const;private:intR1,R2;};voidR::print(){cout<<R1<<":"<<R2<<endl;}voidR::print()const{cout<<R1<<";"<<R2<<endl;}intmain(){Ra(5,4);a.print();//調用voidprint()constRb(20,52);b.print();//調用voidprint()const}46例5-8常成員函數舉例例5-9常數據成員舉例#include<iostream>usingnamespacestd;classA{public: A(inti); voidprint();
constint&r;private:
constinta;
staticconstintb;//靜態常數據成員};constintA::b=10;A::A(inti):a(i),r(a){}voidA::print(){cout<<a<<":"<<b<<":"<<r<<endl;}intmain(){/*建立對象a和b,并以100和0作為初值,分別調用構造函數,通過構造函數的初始化列表給對象的常數據成員賦初值*/Aa1(100),a2(0);a1.print();a2.print();}48例5-9常數據成員舉例對類中常量成員的初始化是通過構造函數中給出的()實現的。函數體A參數表B初始化表C初始化表或函數體D提交單選題1分5.7編譯預處理命令1、#include包含指令(1)將一個源文件嵌入到當前源文件中該點處。(2)#include<文件名>按標準方式搜索,文件位于C++系統目錄的include子目錄下(3)#include"文件名"首先在當前目錄中搜索,若沒有,再按標準方式搜索。5.7編譯預處理命令2#define宏定義指令(1)定義符號常量,很多情況下已被const定義語句取代(2)定義帶參數宏,已被內聯函數取代(3)#undef刪除由#define定義的宏,使之不再起作用
1、#if和#endif#if(常量表達式)
//當“常量表達式”非零時編譯程序正文#endif......5.8條件編譯指令2、#else #if常量表達式
//當“常量表達式”非零時編譯程序正
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學年高中政治單元同步小練4我國政府受人民的監督含解析新人教版必修2
- 社區老年教育課題申報書
- 2025年高考生物實驗知識點復習提綱
- 內蒙古鄂爾多斯市東勝區九年級化學下冊 第七章 溶液 7.3 溶液的濃稀表示(2)教學設計 (新版)粵教版
- 特許金融分析師考試試題與答案的深度解析
- 地理七年級上冊第一節 疆域和行政區劃教學設計及反思
- 2025至2031年中國不銹鋼日用制品行業投資前景及策略咨詢研究報告
- 2025年中國香酥條白面膨化機市場調查研究報告
- 2025年中國流體用無縫鋼管市場調查研究報告
- 2025年注冊會計師考試知識整合試題及答案
- 停電作業工作票配電填寫模板
- 最新EXCEL上機操作練習題1
- 二重積分的概念與性質(課堂PPT)
- 投標法人代表授權書
- 海天注塑機日常點檢表
- 換發藥品生產許可證自查報告格式
- 吊籃四方驗收表
- 抹灰石膏原始記錄
- 復變函數與積分變換第四章級數
- 嚴重障礙量表SIB
- 民法體系圖解(經典)
評論
0/150
提交評論