




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
存儲(chǔ)類(lèi)別和作用域第一頁(yè),共三十二頁(yè),編輯于2023年,星期日4.6存儲(chǔ)類(lèi)別和作用域變量的作用域:是指變量在程序中有效的空間范圍,變量的作用域與定義變量的位置有關(guān);變量的生存期:指的是變量生成到變量空間釋放的時(shí)間范圍,變量的生存期與變量的存儲(chǔ)類(lèi)別相關(guān)。
C++可將作用域分為五種:塊作用域、文件作用域、函數(shù)原型作用域、函數(shù)作用域和類(lèi)作用域。第二頁(yè),共三十二頁(yè),編輯于2023年,星期日1.塊作用域塊:就是用花括號(hào)括起來(lái)的那部分程序。在塊內(nèi)說(shuō)明的標(biāo)識(shí)符只能在該塊內(nèi)引用,即其作用域在塊內(nèi)。所有函數(shù)體內(nèi)定義的變量都具有塊作用域。在一個(gè)函數(shù)內(nèi)或塊內(nèi)定義的變量被稱(chēng)為局部變量;對(duì)于塊中嵌套其他塊的情況,如果嵌套塊中有同名局部變量,服從局部?jī)?yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量。在函數(shù)原型作用域和函數(shù)作用域內(nèi)定義的變量都屬于局部變量;第三頁(yè),共三十二頁(yè),編輯于2023年,星期日【例4.12】局部變量的屏蔽。#include<iostream.h>voidmain(){ inti=5; { cout<<"i1="<<i<<'\n'; //A inti; i=7; cout<<"i2="<<i<<'\n'; //B } cout<<"i3="<<i<<'\n'; //C return;}運(yùn)行結(jié)果是:i1=5i2=7i3=5第四頁(yè),共三十二頁(yè),編輯于2023年,星期日2.文件作用域在所有函數(shù)外定義的變量稱(chēng)為全局變量,全局變量的作用域稱(chēng)為文件的作用域;當(dāng)局部變量與全局變量同名時(shí),局部變量(塊作用域內(nèi)的變量)優(yōu)先。它與塊作用域不同的是:在塊作用域內(nèi)可通過(guò)域運(yùn)算符“::”來(lái)引用與局部變量同名的全局變量。第五頁(yè),共三十二頁(yè),編輯于2023年,星期日【例4.13】在塊作用域內(nèi)引用文件作用域中的同名全局變量。#include<iostream.h>inti=0; //Avoidmain(){ inti=5; //B { cout<<i; //C inti=7; //D cout<<i;//E cout<<::i;//F }}程序運(yùn)行后結(jié)果為:570第六頁(yè),共三十二頁(yè),編輯于2023年,星期日4.6.2變量的存儲(chǔ)類(lèi)別操作系統(tǒng)為一個(gè)C++程序的運(yùn)行所分配的內(nèi)存分為4個(gè)區(qū)域,如圖4.2所示。代碼區(qū):存放程序代碼,即程序中各個(gè)函數(shù)的代碼塊靜態(tài)數(shù)據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)棧區(qū):存放程序中的局部變量,如函數(shù)中的局部變量等堆區(qū):存放動(dòng)態(tài)分配的數(shù)據(jù)。堆區(qū)(動(dòng)態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))main()函數(shù)局部數(shù)據(jù)靜態(tài)數(shù)據(jù)區(qū)(全局變量、靜態(tài)變量)代碼區(qū)(程序代碼)圖4.2程序在內(nèi)存中的區(qū)域第七頁(yè),共三十二頁(yè),編輯于2023年,星期日C++使用四種說(shuō)明符auto(自動(dòng)類(lèi)型)、register(寄存器類(lèi)型)、static(靜態(tài)類(lèi)型)和extern(外部類(lèi)型)來(lái)確定變量的存儲(chǔ)類(lèi)型。加上變量的作用域的不同,在C++中變量共有下列5種存儲(chǔ)形式:局部變量、全局變量、外部變量、靜態(tài)變量、寄存器變量;第八頁(yè),共三十二頁(yè),編輯于2023年,星期日
在函數(shù)或塊內(nèi)部說(shuō)明的變量稱(chēng)為局部變量(如形參變量),由于建立和撤消這些變量是由系統(tǒng)自動(dòng)完成,因此這類(lèi)變量又稱(chēng)為自動(dòng)型變量。注意:a:局部變量?jī)H由說(shuō)明它的函數(shù)或塊的內(nèi)部語(yǔ)句所訪(fǎng)問(wèn);換言之,局部變量在定義自己的函數(shù)或塊之外是不可見(jiàn)的。b:局部變量在進(jìn)入函數(shù)時(shí)生成,退出時(shí)消亡。因此局部變量的生存期僅存在于被定義的函數(shù)或塊中。1、自動(dòng)存儲(chǔ)變量(局部變量,屬于auto型)第九頁(yè),共三十二頁(yè),編輯于2023年,星期日#include<iostream.h>voidfunc1();voidfunc2();voidfunc1(){ intx; x=10; cout<<x<<‘\t’;}voidmain(void){ intx=20; func1(); func2(); cout<<x;}voidfunc2(){ intx; x=-199; cout<<x<<‘\t’;}第十頁(yè),共三十二頁(yè),編輯于2023年,星期日程序說(shuō)明:整形變量x被說(shuō)明了3次,一次在func1中,另一次在func2和main中,func1和func2中的x互不相關(guān),也就是說(shuō),局部變量的值不能在兩次調(diào)用之間保持。在C語(yǔ)言中,必須在函數(shù)或語(yǔ)句塊的開(kāi)頭先于其它任何語(yǔ)句說(shuō)明所有的局部變量。但在C++中,只需在變量使用之前說(shuō)明就可以了。(結(jié)果為:10-19920)第十一頁(yè),共三十二頁(yè),編輯于2023年,星期日
與局部變量不同,全局變量在任何函數(shù)之外說(shuō)明,包括main函數(shù),并且可被任何一個(gè)函數(shù)使用。全局變量將在整個(gè)程序運(yùn)行期間保持有效,同時(shí)可被函數(shù)內(nèi)的任何表達(dá)式訪(fǎng)問(wèn)。說(shuō)明全局變量的最佳位置在程序的一開(kāi)始。2、全局變量第十二頁(yè),共三十二頁(yè),編輯于2023年,星期日#include<iostream.h>intcount;voidfunc1();voidfunc2();voidfunc1(){inttemp;temp=count;func2();cout<<“countis:”<<temp;}voidmain(void){count=100;func1();exit(0);}voidfunc2(){intcount;for(count=1;count<10;count++)cout.put(‘?!?;}第十三頁(yè),共三十二頁(yè),編輯于2023年,星期日
全局變量count既不在main()中說(shuō)明,也不在func1()中說(shuō)明,但可以在兩者中被訪(fǎng)問(wèn)。函數(shù)func2中也說(shuō)明了一個(gè)同名的局部變量count,但func2訪(fǎng)問(wèn)count時(shí),僅訪(fǎng)問(wèn)自己說(shuō)明的局部變量count,而不是那個(gè)全局變量count。注意:全局變量和某一函數(shù)的局部變量同名時(shí),在函數(shù)內(nèi)對(duì)該名的訪(fǎng)問(wèn)權(quán)僅針對(duì)局部變量,對(duì)全局變量無(wú)任何影響。程序執(zhí)行結(jié)果為:。。。。。。。。。countis100//9個(gè)“?!背绦蚍治觯旱谑捻?yè),共三十二頁(yè),編輯于2023年,星期日使用全局變量應(yīng)注意的幾點(diǎn):不論是否需要,全局變量在整個(gè)程序執(zhí)行期間均占用固定的內(nèi)存空間。在使用局部變量就可以達(dá)到其功能時(shí),應(yīng)避免使用全局變量,這樣可以提高函數(shù)的通用性。大量使用全局變量時(shí),可能導(dǎo)致不期望的副作用。例如,變量值在程序其它地點(diǎn)的偶然改變,將在程序的整個(gè)生存期內(nèi)有效。第十五頁(yè),共三十二頁(yè),編輯于2023年,星期日
由于C++語(yǔ)言支持分離編譯,既一個(gè)完整的C++語(yǔ)言程序可以由多個(gè)獨(dú)立的文件組成,每個(gè)文件可以分別單獨(dú)編譯,然后再由鏈接程序完成程序組裝。因此必須將程序需要的所有全局變量通過(guò)某種方法告訴所有的獨(dú)立文件。方法就是在一個(gè)文件中說(shuō)明所有全局變量,在其它文件中用extern再次描述它們。因此外部變量定義是:由extern說(shuō)明的全局變量稱(chēng)為外部變量。3、外部變量第十六頁(yè),共三十二頁(yè),編輯于2023年,星期日文件1intx,y;charch;Voidmain(void){...........}文件2externintx,y;externcharch;voidfunc22(){x=y/10;}voidfunc1(){x=123;}voidfunc23(){y=10;}程序分析:在文件2中,全局變量表是從文件1中復(fù)制過(guò)來(lái)的,并將分類(lèi)符extern加在說(shuō)明之前。extern告訴編譯程序,如下變量的類(lèi)型和名字已在別處說(shuō)明過(guò)了。第十七頁(yè),共三十二頁(yè),編輯于2023年,星期日穩(wěn)定的具有固定的內(nèi)存地址的變量稱(chēng)為靜態(tài)變量;
(
或:用static修飾的變量);
靜態(tài)變量不象動(dòng)態(tài)變量是在程序執(zhí)行過(guò)程中被動(dòng)態(tài)建立、動(dòng)態(tài)撤消的。靜態(tài)變量的定義格式為:static變量類(lèi)型變量列表;靜態(tài)變量又可分為靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量:是指定義在模塊內(nèi)部的靜態(tài)變量。它與局部變量的共同點(diǎn)是:都是局限于某個(gè)模塊內(nèi)部;僅在該模塊內(nèi)是有效的;4、靜態(tài)變量第十八頁(yè),共三十二頁(yè),編輯于2023年,星期日
局部變量?jī)H存在于該模塊被調(diào)用時(shí),函數(shù)退出后,該變量就消失了。因此,它沒(méi)有連續(xù)性,在末賦初值時(shí),其值不定;而靜態(tài)局部變量是始終存在的,即使退出該模塊,變量仍然有效。這是因?yàn)樗趦?nèi)存中占有固定的單元,在多次調(diào)用該模塊時(shí),可以保持此變量的連續(xù)性。它們的不同點(diǎn)是:第十九頁(yè),共三十二頁(yè),編輯于2023年,星期日#include<iostream.h>voidabc(intx,inty,intz);voidmain(void){ inti,j,k; i=5;j=10; for(k=1;k<=5;k++) abc(i,j,k);}voidabc(intx,inty,intz){ intm; staticintn; if(z==1) {m=0;n=0;} else { m+=x+y; n+=x+y; } cout<<"m="<<m<<",n="<<n<<'\n';}例:說(shuō)明靜態(tài)局部變量與局部變量的區(qū)別;第二十頁(yè),共三十二頁(yè),編輯于2023年,星期日在上例中,函數(shù)abc()中的if語(yǔ)句if(z==0) {m=0;n=0;}是為了同時(shí)給m,n賦值。然而多次調(diào)用函數(shù)abc(),n的初值在起作用,保持了連續(xù)性。而m初值沒(méi)有起作用,沒(méi)有連續(xù)性。語(yǔ)句m+=x+y;在z!=1以后的多次調(diào)用中,結(jié)果為不確定(因?yàn)闆](méi)有被賦值)。程序運(yùn)行結(jié)果: m=0,n=0; m=*,n=15 m=*,n=30; m=*,n=45; m=*,n=60;其中*表示不確定值。程序說(shuō)明:第二十一頁(yè),共三十二頁(yè),編輯于2023年,星期日
用static修飾全局變量稱(chēng)為靜態(tài)全局變量。靜態(tài)全局變量與全局變量在形式上類(lèi)似,但意義不同。靜態(tài)全局變量只在它被定義的源文件中是有效的(該文件可以有幾個(gè)函數(shù)),而在任何別的源文件中則是無(wú)效的。而全局變量通過(guò)extern修飾后可以作用于一個(gè)程序的多個(gè)源文件中。靜態(tài)全局變量:第二十二頁(yè),共三十二頁(yè),編輯于2023年,星期日例:文件1staticinti=5;intj=10;voidmain(void){ intk1,k2; k1=f1(i,j); k2=f2(i,j); cout<<"k1="<<k1<<",k2="<<k2<<endl;}f1(intx,inty){ intz; z=x+y+i; return(z);}文件2externintj;f2(inta,intb){ intc; c=a*b+j; return(c);}運(yùn)行結(jié)果:k1=20,k2=60;第二十三頁(yè),共三十二頁(yè),編輯于2023年,星期日程序說(shuō)明:這個(gè)程序有三個(gè)函數(shù):main,f1,f2。其中函數(shù)f2單獨(dú)作為一個(gè)文件,main和f1為另一個(gè)文件。程序中用一個(gè)靜態(tài)全局變量i和一個(gè)全局變量j。因此變量j既可以在文件1中使用,也可以在文件2中通過(guò)extern說(shuō)明使用。然而,變量i是靜態(tài)全局變量,它只能在文件1中使用,即在函數(shù)main和函數(shù)f1中使用。第二十四頁(yè),共三十二頁(yè),編輯于2023年,星期日C++語(yǔ)言提供了一種僅用于int和char類(lèi)型變量的存儲(chǔ)分類(lèi)符register,(因?yàn)橥ǔ<拇嫫魇?6位或32位字長(zhǎng))。它的定義是:用register修飾的局部變量稱(chēng)為寄存器變量。幾點(diǎn)注意:分類(lèi)符register要求編譯系統(tǒng)將它所說(shuō)明的變量值保存在CPU寄存器中,而不是象普通變量那樣存放在內(nèi)存單元中,此時(shí)由于對(duì)變量的存取不必訪(fǎng)問(wèn)內(nèi)存,因此運(yùn)算速度大大快于普通變量的運(yùn)算。這一類(lèi)變量常用于循環(huán)控制部分;分類(lèi)符register僅可用于局部變量和函數(shù)的形式參數(shù),因?yàn)檫@些變量都是缺省的自動(dòng)變量。全局的register變量是不允許的;5、寄存器變量第二十五頁(yè),共三十二頁(yè),編輯于2023年,星期日因?yàn)閞egister變量存放在CPU的寄存器中,所以它沒(méi)有地址,也就是說(shuō),不能用地址操作符&對(duì)register變量進(jìn)行地址操作;一個(gè)函數(shù)中所允許的寄存器變量的數(shù)目取決于處理器類(lèi)型以及所指定的C++編譯系統(tǒng)。若程序中寄存器變量的數(shù)量超過(guò)極限時(shí),編譯系統(tǒng)可能自動(dòng)將它們轉(zhuǎn)換成自動(dòng)變量,從而保證了程序的可移植性;第二十六頁(yè),共三十二頁(yè),編輯于2023年,星期日int_pwr(intm,registerinte){ registerinttemp; temp=1; for(;e;e--) temp=temp*m; return(temp);}程序說(shuō)明:其中e和temp因用在循環(huán)中而又都說(shuō)明為register變量,由于register變量可以提高速度,因此它是最理想的循環(huán)控制變量。例:求M的e次冪。第二十七頁(yè),共三十二頁(yè),編輯于2023年,星期日最后總結(jié):全局變量和靜態(tài)變量只在程序的開(kāi)始一次生成;局部變量和寄存器變量在進(jìn)入定義它們的程序塊和每個(gè)入口多次生成;沒(méi)有賦值的局部變量和寄存器變量在第一個(gè)賦值語(yǔ)句之前是末知的。例1:不同存儲(chǔ)類(lèi)變量的應(yīng)用;例2:自動(dòng)類(lèi)與局部靜態(tài)類(lèi)變量的應(yīng)用;例3:由多個(gè)文件組成的程序中變量的作用域;第二十八頁(yè),共三十二頁(yè),編輯于2023年,星期日#include<iostream.h>#include<iomanip.h>inti=1;voidother(void);voidmain(void){ staticinta; registerintb=-10; intc=0; cout<<"i: "<<"a: "<<"b: "<<"c: "<<endl; cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl;//例:不同存儲(chǔ)類(lèi)型變量的應(yīng)用 c+=8; other(); cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl; i+=10; other();}voidother(void){ staticinta=2; staticintb; intc=10; a+=2; i+=32; c+=5; cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl; b=a;}
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)電子塑膠五金制品行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)手編結(jié)藝寶石項(xiàng)鏈行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)寶貝金水行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)塑鋼型PVC扣板行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)不銹鋼列管式換熱器行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2030年中國(guó)電氣動(dòng)閥門(mén)定位器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 地下室冒水修理施工方案
- 煤礦井下立井煤倉(cāng)施工方案
- 24《古人談讀書(shū)》教學(xué)設(shè)計(jì)- 2024-2025學(xué)年統(tǒng)編版五年級(jí)語(yǔ)文上冊(cè)
- 全國(guó)冀教版信息技術(shù)四年級(jí)上冊(cè)新授課 第12課 圖片的瀏覽和編輯 教學(xué)設(shè)計(jì)
- 寶石學(xué)基礎(chǔ)全套課件
- 市級(jí)臨床重點(diǎn)專(zhuān)科申報(bào)書(shū)
- 手術(shù)風(fēng)險(xiǎn)及醫(yī)療意外險(xiǎn)告知流程
- 綜合實(shí)踐活動(dòng)六年級(jí)下冊(cè) 飲料與健康課件 (共16張PPT)
- 數(shù)量金融的概況和歷史課件
- 《醫(yī)院重點(diǎn)專(zhuān)科建設(shè)專(zhuān)項(xiàng)資金管理辦法》
- 最新短視頻運(yùn)營(yíng)績(jī)效考核表KPI(優(yōu)選.)
- 設(shè)備基礎(chǔ)隔振設(shè)計(jì)探討
- 千字文全文帶拼音——完美打印版
- JTT 1344-2020純電動(dòng)汽車(chē)維護(hù)、檢測(cè)、診斷技術(shù)規(guī)范_(高清-最新)
- 蘭州大學(xué)接受進(jìn)修人員申請(qǐng)表
評(píng)論
0/150
提交評(píng)論