第五章 多文件結構_第1頁
第五章 多文件結構_第2頁
第五章 多文件結構_第3頁
第五章 多文件結構_第4頁
第五章 多文件結構_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數(shù)據的共享與保護作用域與可見性對象的生存期數(shù)據與函數(shù)靜態(tài)成員共享數(shù)據的保護友元編譯預處理命令多文件結構和工程5-1-1標識符作用域1.函數(shù)原型作用域例如,以下函數(shù)原型編譯器認為是相同的:

doublefunPrototype(double,double); doublefunPrototype(doublea,doubleb); doublefunPrototype(doublex,doubley);函數(shù)原型形式參數(shù)表中的標識符具有函數(shù)原型作用域

作用域指標識符能夠被使用的范圍。只有在作用域內標識符才可以被訪問(稱為可見)。函數(shù)原型中的參數(shù),其作用域始于

"(",結束于")"。例如,設有下列原型聲明:doubleArea(doubleradius);radius的作用域僅在于此,不能用于程序正文其他地方,因而可有可無。2.塊作用域在語句塊中聲明的標識符具有塊作用域//例

不同作用域的同名變量#include<iostream>usingnamespacestd;intmain(){inta=1; //外層的a{inta=1; //內層的aa++;cout<<"insidea="<<a<<endl;} //內層的a作用域結束cout<<"outsidea="<<

a

<<endl;} //外層的a作用域結束2.塊作用域在語句塊中聲明的標識符具有塊作用域//例3-25不同作用域的同名變量#include<iostream>usingnamespacestd;intmain(){int

a

=1; //外層的a{int

a

=1;

//內層的a

a

++;cout<<"insidea="<<

a

<<endl;} //內層的a作用域結束cout<<"outsidea="<<

a

<<endl;} //外層的a作用域結束insidea=2outsidea=1內層的a覆蓋了外層的a3.函數(shù)作用域語句標號(后面帶冒號的標識符)是惟一具有函數(shù)作用域的標識符語句標號用于switch結構中的case標號,goto語句轉向入口的語句標號標號可以在函數(shù)體中任何地方使用,但不能在函數(shù)體外引用類作用域作用于特定的成員名。類X的成員M具有類作用域,對M的訪問方式如下:如果在X的成員函數(shù)中沒有聲明同名的局部作用域標識符,那么在該函數(shù)內可以訪問成員M。通過表達式x.M或者X::M訪問。通過表達式prt->M4.類作用域5.文件作用域任何在函數(shù)之外聲明的標識符具有文件作用域這種標識符從聲明處起至文件尾的任何函數(shù)都可見//例

使用文件作用域變量#include<iostream>usingnamespacestd;inta=1,b=1;voidf1(intx){a=x*x;b=a*x;}intc;voidf2(intx,inty){a=x>y?x:y;b=x<y?x:y;c=x+y;}intmain(){f1(4); cout<<"callfunctionf1:\n";cout<<"a="<<a<<",b="<<b<<endl;f2(10,23);cout<<"callfunctionf2:\n";cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;}//例

使用文件作用域變量#include<iostream>usingnamespacestd;inta

=1,

b

=1;

voidf1(intx) {a=x*x;

b=a*x;}intc; voidf2(intx,inty) {a=x>y?x:y;b=x<y?x:y;

c=x+y;}intmain(){f1(4); cout<<"callfunctionf1:\n";cout<<"a="<<a<<",b="<<b<<endl;f2(10,23);cout<<"callfunctionf2:\n";cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;}//

a,b的作用域從這里開始//f1函數(shù)可以訪問a,b//f2函數(shù)可以訪問a,b//main函數(shù)可以訪問a,b//例

使用文件作用域變量#include<iostream>usingnamespacestd;inta

=1,

b

=1;

voidf1(intx) {a=x*x;

b=a*x;}intc; voidf2(intx,inty) {a=x>y?x:y;b=x<y?x:y;

c=x+y;}intmain(){f1(4); cout<<"callfunctionf1:\n";cout<<"a="<<a<<",b="<<b<<endl;f2(10,23);cout<<"callfunctionf2:\n";cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;}//

a,b的作用域從這里開始//f1函數(shù)可以訪問a,b//f2函數(shù)可以訪問a,b//main函數(shù)可以訪問a,b//

c

的作用域從這里開始,默認初始值為0//f2函數(shù)可以訪問a,b,c//main函數(shù)可以訪問a,b,c6.全局變量和局部變量具有文件作用域的變量稱為全局變量;具有函數(shù)作用域或塊作用域的變量稱為局部變量全局變量聲明時默認初始值為0

當局部量與全局量同名,在塊內屏蔽全局量為了在塊內訪問全局量,可以用域運算符"::"6.全局變量和局部變量//在函數(shù)體內訪問全局變量#include<iostream>usingnamespacestd;intx;intmain(){intx=256;cout<<"globalvariablex="<<::x<<endl;cout<<"localvariablex="<<x<<endl;}6.全局變量和局部變量//在函數(shù)體內訪問全局變量#include<iostream>usingnamespacestd;intx

;intmain(){intx=256;cout<<"globalvariablex="<<::x<<endl;cout<<"localvariablex="<<x<<endl;}訪問全局量6.全局變量和局部變量//在函數(shù)體內訪問全局變量#include<iostream>usingnamespacestd;intx;intmain(){intx=256;cout<<"globalvariablex="<<::x<<endl;cout<<"localvariablex="<<x<<endl;}訪問局部量6.全局變量和局部變量//在函數(shù)體內訪問全局變量#include<iostream>usingnamespacestd;intx;intmain(){intx=256;cout<<"globalvariablex="<<::x<<endl;cout<<"localvariablex="<<x<<endl;}7命名空間

命名空間是類、函數(shù)、對象、類型和其他名字的集合。命名空間令軟件組件之間不會產生命名沖突。

std是C++的標準名空間,包含了標準頭文件中各種名字的聲明。標準名空間

C++標準頭文件沒有擴展名。

iostreamiomaniplimitfstreamstringtypeinfostdexcept

使用標準類庫的組件時,需要指定名空間。

C++標準名空間std//方法一:#include<iostream> usingnamespacestd; intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//方法一:#include<iostream> usingnamespacestd; intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//包含頭文件//方法一:#include<iostream>

usingnamespacestd;

intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//包含頭文件//使用標準名空間std//方法一:#include<iostream>

usingnamespacestd; intmain(){inta,b;cin>>a;

cin>>b; cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//包含頭文件//使用標準名空間std//使用std的元素cin//方法一:#include<iostream>

usingnamespacestd; intmain(){inta,b;cin>>a;

cin>>b;

cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//包含頭文件//使用標準名空間std//使用std的元素cin//使用std的元素cout//方法一:#include<iostream> usingnamespacestd; intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n'; }使用標準名空間//包含頭文件//指定使用名空間std//使用std的元素cin//使用std的元素cin//使用std的元素cout//方法二:#include<iostream>usingstd::cin;usingstd::cout;intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n';}使用標準名空間//方法二:#include<iostream>usingstd::cin;usingstd::cout;intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//方法二:#include<iostream>usingstd::cin;

usingstd::cout;intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout//方法二:#include<iostream>usingstd::cin;

usingstd::cout;intmain(){inta,b;

cin>>a;

cin>>b; cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout//使用std的元素cin//方法二:#include<iostream>usingstd::cin;

usingstd::cout;intmain(){inta,b;cin>>a; cin>>b;

cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout//使用std的元素cin//使用std的元素cout//方法二:#include<iostream>usingstd::cin;usingstd::cout;intmain(){inta,b;cin>>a; cin>>b; cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout//使用std的元素cin//使用std的元素cout//方法三:#include<iostream>intmain(){inta,b;std::cin>>a;std::cin>>b;std::cout<<"a+b="<<a+b<<'\n';}使用標準名空間//方法三:#include<iostream>intmain(){inta,b;std::cin>>a;std::cin>>b;

std::cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//方法三:#include<iostream>intmain(){inta,b;

std::cin>>a;std::cin>>b;std::cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout//方法三:#include<iostream>intmain(){inta,b;std::cin>>a;std::cin>>b;std::cout<<"a+b="<<a+b<<'\n';}使用標準名空間//指定使用std的元素cin//指定使用std的元素cout定義名空間

定義命名空間語法:namespace<標識符>{<語句序列>}namespaceA{voidf();voidg();}namespaceB{voidh();namespaceC //嵌套命名空間

{voidi();}}namespaceA //為namespaceA追加說明

{voidj();}定義名空間定義命名空間語法:

usingnamespace

名空間;或

using

名空間::元素;//例

演示命名空間的使用#include<iostream>usingnamespacestd;namespaceA{voidf(){cout<<"f():fromnamespaceA\n";}voidg(){cout<<"g():fromnamespaceA\n";}namespaceB{voidf(){cout<<"f():fromnamespaceB\n";}namespaceC{voidf(){cout<<"f():fromnamespaceC\n";}}}}voidg(){cout<<"g():fromglobalnamespace“<<endl;}intmain(){g();usingnamespaceA;f();B::f();B::C::f();A::g();}調用非命名空間函數(shù)g()使用命名空間A調用命名空間函數(shù)A::g()調用函數(shù)A::B::f()調用函數(shù)A::B::C::f()調用函數(shù)A::g()可見性

可見性從另一個角度說明標識符的有效性,可見性與作用域具有一定的一致性。標識符的作用域包含可見范圍,可見范圍不會超過作用域??梢娦栽诶斫馔麡俗R符的作用域嵌套時十分直觀。對于外層塊與內層塊定義了同名標識符的,在外層作用域中,內層所定義的標識符是不可見的,即外層引用的是外層所定義的標識符;同樣,在內層作用域中,外層的標識符將被內層的同名標識符屏蔽,變得不可見,即外層中同名標識符的可見范圍為作用域中挖去內層塊的范圍??梢娦?/p>

下面的程序段和圖示顯示作用域與可見性。

intm=1;floatx;{floatm=3.5;X=5.5;}m++;

intm,floatx作用域intm可見floatm不可見x可見floatm作用域floatm可見intm不可見x可見

5-2

生命期

(1)靜態(tài)生命期

(2)局部生命期

(3)動態(tài)生命期

生命期(Lifetime)也叫生存期。生命期與存儲區(qū)域相關,存儲區(qū)域分為代碼區(qū)、靜態(tài)數(shù)據區(qū)、棧區(qū)和堆區(qū),相應地,生命期分為靜態(tài)生命期、局部生命期和動態(tài)生命期。(1)靜態(tài)生命期

靜態(tài)生命期指的是標識符從程序開始運行時存在,即具有存儲空間,到程序運行結束時消亡,即釋放存儲空間。具有靜態(tài)生命期的標識符存放在靜態(tài)數(shù)據區(qū),屬于靜態(tài)存儲類型,如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標識符在未被用戶初始化的情況下,系統(tǒng)會自動將其初始化為全0。

函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標識符都具有靜態(tài)生命期。(2)局部生命期

在函數(shù)內部或塊中定義的標識符具有局部生命期,其生命期開始于執(zhí)行到該函數(shù)或塊的標識符聲明處,結束于該函數(shù)或塊的結束處。具有靜態(tài)生命期的標識符存放在棧區(qū)。具有局部生命期的標識符如果未被初始化,其內容是隨機的,不可用。具有局部生命期的標識符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。(3)動態(tài)生命期

具有動態(tài)生命期的標識符由特定的函數(shù)調用或運算來創(chuàng)建和釋放,如調用malloc()或用new運算符為變量分配存儲空間時,變量的生命期開始,而調用free()或用delete運算符釋放空間或程序結束時,變量生命期結束。具有動態(tài)生命期的變量存放在堆區(qū)。關于new運算和delete運算將在指針一章中介紹。#include<iostream.h>voidfun();intmain(){fun();fun();}voidfun(){staticinta=1;inti=5;

a++;

i++;cout<<"i="<<i<<",a="<<a<<endl;}運行結果:i=6,a=2i=6,a=3i是動態(tài)生存期a是靜態(tài)生存期例5-2變量的生存期與可見性#include<iostream.h>inti=1;//i為全局變量,具有靜態(tài)生存期。intmain(){staticinta;//靜態(tài)局部變量,有全局壽命,局部可見。

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

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

i=i+10;other();}voidother(void){staticinta=2;staticintb;//a,b為靜態(tài)局部變量,具有全局壽命,局部可見。

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

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

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

a=a+2;i=i+32;c=c+5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;b=a;}17運行結果:---MAIN---i:1a:0b:-10c:0---OTHER---i:33a:4b:0c:15---MAIN---i:33a:0b:-10c:8---OTHER---i:75a:6b:4c:1518例5-3具有靜態(tài)、動態(tài)生存期對象的時鐘程序#include<iostream.h>classClock //時鐘類聲明{public: //外部接口

Clock(); voidSetTime(intNewH,intNewM,intNewS);//三個形參均具有函數(shù)原型作用域

voidShowTime(); ~Clock(){}private: //私有數(shù)據成員

intHour,Minute,Second;};//時鐘類成員函數(shù)實現(xiàn)Clock::Clock()//構造函數(shù){ Hour=0; Minute=0; Second=0;}voidClock::SetTime(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}voidClock::ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}20ClockglobClock;//聲明對象globClock,

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

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

globClock.SetTime(8,30,30); ClockmyClock(globClock);//聲明具有塊作用域的對象myClock cout<<"Secondtimeoutput:"<<endl; myClock.ShowTime(); //引用具有塊作用域的對象}21程序的運行結果為:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022多文件程序結構

一個C++程序稱為一個工程(.dsp)一個工程由一個或多個文件組成一個文件可以包含多個函數(shù)定義,但一個函數(shù)的定義必須完整地存在于一個文件中一個文件可以被多個應用程序共享多文件結構

一個好的軟件系統(tǒng)應當分解為各種同構邏輯文件頭文件A頭文件B頭文件C實現(xiàn)文件A.cpp實現(xiàn)文件B.cpp實現(xiàn)文件C.cpp 主文件M.cpp 例

計算圓面積和矩形面積myAreamyCircle.cppmyRect.cpp

myMain.cpp 例計算圓面積和矩形面積constdoublepi=3.14;doublecircle(doubleradius){returnpi*radius*radius;}myCircle.cppdoublerect(doublewith,doublelength){returnwith*length;}myRect.cppdoublecircle(doubleradius);doublerect(doublewidth,doublelength);myArea例3-27計算圓面積和矩形面積#include<iostream>usingnamespacestd;#include"myArea"intmain(){doublewidth,length;cout<<"Pleaseentertwonumbers:\n";cin>>width>>length;cout<<"Areaofrecttangleis:"<<rect(width,length)<<endl;doubleradius;cout<<"Pleaseenteraradius:\n";cin>>radius;cout<<"Areaofcircleis:"<<circle(radius)<<endl;}

myMain.cpp預處理指令源程序預處理器詞法分析語法分析代碼生成錯誤處理程序目標程序符號表錯誤信息C++編譯器工作過程預處理器

改善程序的組織和管理預處理指令

所有編譯指令以#

開頭,每條指令單獨占一行預處理指令1.文件包含include指令在編譯之前把指定文件包含到該命令所在位置

#

include

<文件名>或 #

include

"文件名"

形式為:系統(tǒng)頭文件預處理指令1.文件包含include指令在編譯之前把指定文件包含到該命令所在位置

#

include

<文件名>或 #

include

"文件名"

形式為:自定義頭文件預處理指令2.條件編譯形式1#if

常量表達式程序段#endif形式2#if

常量表達式程序段1#else程序段2#endif形式3#if

常量表達式1程序段1

#elif

常量表達式2程序段2…#elif

常量表達式n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論