面向?qū)ο蟪绦蛟O(shè)計(jì)-6_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)-6_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)-6_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)-6_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)-6_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)第6講

C++程序結(jié)構(gòu)習(xí)題講解4-194-203本章主要內(nèi)容作用域與可見性對(duì)象的生存期數(shù)據(jù)與函數(shù)靜態(tài)成員共享數(shù)據(jù)的保護(hù)友元編譯預(yù)處理命令多文件結(jié)構(gòu)和工程深度探索4函數(shù)原形的作用域函數(shù)原型中的參數(shù),其作用域始于

"(",結(jié)束于")"。例如,設(shè)有下列原型聲明:doublearea(doubleradius);radius的作用域僅在于此,不能用于程序正文其他地方,因而可有可無。作用域與可見性5局部作用域函數(shù)的形參,在塊中聲明的標(biāo)識(shí)符,其作用域自聲明處起,限于塊中,例如:voidfun(inta){intb=a;cin>>b;if(b>0){intc;......}}c的作用域b的作用域作用域與可見性a的作用域6類作用域類作用域作用于特定的成員名。類X的成員m具有類作用域,對(duì)m的訪問方式如下:如果在X的成員函數(shù)中沒有聲明同名的局部作用域標(biāo)識(shí)符,那么在該函數(shù)內(nèi)可以訪問成員m。通過表達(dá)式x.m或者X::m訪問。通過表達(dá)式ptr->M作用域與可見性7命名空間命名空間可以解決類名、函數(shù)名等的命名沖突命名空間的聲明namespace命名空間名{

各種聲明(函數(shù)聲明、類聲明、……)}例namespaceSomeNs

{ classSomeClass{...};}特殊的命名空間全局命名空間:默認(rèn)的命名空間匿名命名空間:對(duì)每個(gè)源文件是唯一的(注意其作用)作用域與可見性命名空間作用域一個(gè)命名空間確定了一個(gè)命名空間作用域引用其它命名空間作用域中的標(biāo)識(shí)符命名空間名::標(biāo)識(shí)符名例:聲明一個(gè)SomeClass型的對(duì)象SomeNs::SomeClassobj1;將其它命名空間作用域的標(biāo)識(shí)符暴露于當(dāng)前作用域?qū)χ付?biāo)識(shí)符using命名空間名::標(biāo)識(shí)符名;對(duì)所有標(biāo)識(shí)符usingnamespace命名空間名;8作用域與可見性9可見性可見性是從對(duì)標(biāo)識(shí)符的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域“看”時(shí)能看見什么。如果標(biāo)識(shí)在某處可見,則就可以在該處引用此標(biāo)識(shí)符。塊作用域類作用域命名空間作用域作用域與可見性10可見性標(biāo)識(shí)符應(yīng)聲明在先,引用在后。如果某個(gè)標(biāo)識(shí)符在外層中聲明,且在內(nèi)層中沒有同一標(biāo)識(shí)符的聲明,則該標(biāo)識(shí)符在內(nèi)層可見。對(duì)于兩個(gè)嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標(biāo)識(shí)符,則外層作用域的標(biāo)識(shí)符在內(nèi)層不可見。作用域與可見性11同一作用域中的同名標(biāo)識(shí)符在同一作用域內(nèi)的對(duì)象名、函數(shù)名、枚舉常量名會(huì)隱藏同名的類名或枚舉類型名。重載的函數(shù)可以有相同的函數(shù)名。作用域與可見性12#include<iostream>usingnamespacestd;inti; //在全局命名空間中的全局變量namespaceNs{ intj; //在Ns命名空間中的全局變量}intmain(){ i=5; //為全局變量i賦值

Ns::j=6; //為全局變量j賦值

{ //子塊1 usingnamespaceNs;//當(dāng)前塊中可以直接引用Ns中的標(biāo)識(shí)符

inti; //局部變量,局部作用域

i=7; cout<<"i="<<i<<endl;//輸出7 cout<<"j="<<j<<endl;//輸出6 } cout<<"i="<<i<<endl; //輸出5 return0;}作用域與可見性例5.113對(duì)象的生存期對(duì)象從產(chǎn)生到結(jié)束的這段時(shí)間就是它的生存期。在對(duì)象生存期內(nèi),對(duì)象將保持它的值,直到被更新為止。14靜態(tài)生存期這種生存期與程序的運(yùn)行期相同。在文件作用域中聲明的對(duì)象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對(duì)象,要冠以關(guān)鍵字static

。只生成一次,只初始化一次對(duì)象的生存期voidfun(){ staticintk=10;

k++; cout<<k<<endl;}voidfun(){ staticintk; k=10; k++; cout<<k<<endl;}結(jié)果一樣嗎?voidmain(){

for(intI=0;I<10;I++) fun();

}15#include<iostream>usingnamespacestd;inti=5;//文件作用域intmain(){cout<<"i="<<i<<endl;return0;}i具有靜態(tài)生存期對(duì)象的生存期例16動(dòng)態(tài)生存期塊作用域中聲明的,沒有用static修是的對(duì)象是動(dòng)態(tài)生存期的對(duì)象(習(xí)慣稱局部生存期對(duì)象)。開始于程序執(zhí)行到聲明點(diǎn)時(shí),結(jié)束于命名該標(biāo)識(shí)符的作用域結(jié)束處。對(duì)象的生存期17#include<iostream>usingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){

staticinta=1;inti=5;

a++;

i++;cout<<"i="<<i<<",a="<<a<<endl;}運(yùn)行結(jié)果:i=6,a=2i=6,a=3i是動(dòng)態(tài)生存期a是靜態(tài)生存期對(duì)象的生存期例變量類型總結(jié)19例5-2變量的生存期與可見性#include<iostream>usingnamespacestd;inti=1;//i為全局變量,具有靜態(tài)生存期。voidother(){staticinta=2;staticintb;//a,b為靜態(tài)局部變量,具有全局壽命,局部可見。

//只第一次進(jìn)入函數(shù)時(shí)被初始化。

intc=10;//C為局部變量,具有動(dòng)態(tài)生存期,

//每次進(jìn)入函數(shù)時(shí)都初始化。

a+=

2;i+=

32;c+=

5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

b=a;}對(duì)象的生存期intmain(){staticinta;//靜態(tài)局部變量,有全局壽命,局部可見。

intb=-10;//b,c為局部變量,具有動(dòng)態(tài)生存期。

intc=0; cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;c+=8;other();cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

i+=

10;other(); return0;}17運(yùn)行結(jié)果:---MAIN---

i:1

a:0b:-10c:0---OTHER---

i:33

a:4b:0c:15---MAIN---

i:33

a:0b:-10c:8---OTHER---

i:75

a:6b:4c:151822例5-3具有靜態(tài)、動(dòng)態(tài)生存期對(duì)象的時(shí)鐘程序#include<iostream>usingnamespacestd;classClock{ //時(shí)鐘類定義public: //外部接口

Clock(); voidsetTime(intnewH,intnewM,intnewS);//三個(gè)形參均具有函數(shù)原型作用域

voidshowTime();private: //私有數(shù)據(jù)成員

inthour,minute,second;};對(duì)象的生存期Clock::Clock():hour(0),minute(0),second(0){} //構(gòu)造函數(shù)voidClock::setTime(intnewH,intnewM,intnewS){//三個(gè)形參均具有局部作用域

hour=newH; minute=newM; second=newS;}voidClock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl;}20ClockglobClock;//聲明對(duì)象globClock,

//具有靜態(tài)生存期,文件作用域intmain(){//主函數(shù) cout<<"Firsttimeoutput:"<<endl;

//引用具有文件作用域的對(duì)象:

globClock.showTime();//對(duì)象的成員函數(shù)具有類作用域

globClock.setTime(8,30,30); ClockmyClock(globClock);

//聲明具有塊作用域的對(duì)象myClock cout<<"Secondtimeoutput:"<<endl;

myClock.showTime(); //引用具有塊作用域的對(duì)象 return0;}21程序的運(yùn)行結(jié)果為:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:302226數(shù)據(jù)與函數(shù)數(shù)據(jù)存儲(chǔ)在局部對(duì)象中,通過參數(shù)傳遞實(shí)現(xiàn)共享——函數(shù)間的參數(shù)傳遞。數(shù)據(jù)存儲(chǔ)在全局對(duì)象中。將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中。數(shù)據(jù)與函數(shù)27使用全局對(duì)象#include<iostream>usingnamespacestd;intglobal;voidf(){global=5;}voidg(){cout<<global<<endl;}intmain(){f();g();//輸出“5”return0;}數(shù)據(jù)與函數(shù)28將函數(shù)與數(shù)據(jù)封裝#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;}數(shù)據(jù)與函數(shù)29靜態(tài)成員靜態(tài)數(shù)據(jù)成員用關(guān)鍵字static聲明該類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝必須在類外定義和初始化,用(::)來指明所屬的類。靜態(tài)成員函數(shù)類外代碼可以使用類名和作用域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。靜態(tài)成員30例5-4

具有靜態(tài)數(shù)據(jù)成員的Point類#include<iostream>usingnamespacestd;classPoint {public: Point(intx=0,inty=0):x(x),y(y){count++;} Point(Point&p); intgetX(){returnx;} intgetY(){returny;} voidshowCount(){ cout<<"Objectcount=“<<count<<endl;}private: intx,y;

staticintcount;};靜態(tài)成員Point::Point(Point&p){ x=p.x; x=p.y; count++;}intPoint::count=0;intmain(){ Pointa(4,5); cout<<"PointA:"<<a.getX()<<","<<a.getY(); a.showCount(); Pointb(a); cout<<"PointB:"<<b.getX()<<","<<b.getY(); b.showCount(); return0;}2832靜態(tài)成員函數(shù)舉例#include<iostream>usingnamespacestd;classApplication{public:staticvoidf();staticvoidg();private:staticintglobal;};intApplication::global=0;voidApplication::f(){ global=5;}voidApplication::g(){ cout<<global<<endl;}intmain(){ Application::f(); Application::g(); return0;}靜態(tài)成員33靜態(tài)成員函數(shù)舉例classA{public: staticvoidf(Aa);private: intx;};voidA::f(Aa){ cout<<x;//對(duì)x的引用是錯(cuò)誤的 cout<<a.x;//正確}靜態(tài)成員34具有靜態(tài)數(shù)據(jù)、函數(shù)成員的Point類#include<iostream>usingnamespace

溫馨提示

  • 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. 人人文庫網(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)論