《第3章5C程序的结构.ppt》由会员分享,可在线阅读,更多相关《第3章5C程序的结构.ppt(47页珍藏版)》请在三一办公上搜索。
1、C+程序的结构,计算机科学与技术学院 曲立平Email:,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,函数原型的作用域,函数原型中的参数,其作用域始于(,结束于)。例:设有下列原型声明:double Area(double radius);,radius 的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。,哈尔滨工程大学计算机科学与技术学院,块作用域,在块中声明的标识符,其作用域自声明处起,限于块中。例:void fun(int a)int b(a);cinb;if(b0)int c;.,哈尔滨工程大学计算机科学与技术学院,类作用域,类作用域作用于特定的成员
2、名。类X的成员M具有类作用域,对M的访问方式如下:如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员M。通过表达式x.M或者X:M访问。通过表达式prt-M,哈尔滨工程大学计算机科学与技术学院,类作用域,#include class C public:C(int v):X(v)void SetX(int X)C:X=X;/this-X=X;正确int GetX()return X;private:int X;void main(void)C c(1);c.SetX(5);coutc.GetX();,哈尔滨工程大学计算机科学与技术学院,文件作用域,不在前述各个作用域中
3、出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。,哈尔滨工程大学计算机科学与技术学院,可见性,可见性是从对标识符的引用的角度来谈的概念。可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。,块作用域,哈尔滨工程大学计算机科学与技术学院,可见性,标识符应声明在先,引用在后。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。,哈尔滨工程大学计算机科学与技术学院,同一作用域中的同名
4、标识符,在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。重载的函数可以有相同的函数名。,哈尔滨工程大学计算机科学与技术学院,例:文件作用域与块作用域,#includeint i;int main()i=5;int i;i=7;couti=iendl;couti=i;return 0;,/文件作用域,/块作用域,/输出7,/输出5,哈尔滨工程大学计算机科学与技术学院,例:非类型名隐藏类型名,Class Sample/定义类/;void func(int Sample)/函数形参隐藏了类名class Sample a;/定义一个对象要用到类名 Sample+;/形参的算术运
5、算/,类名被函数的形参覆盖,函数内定义类对象,需加前缀class,哈尔滨工程大学计算机科学与技术学院,例:类型名隐藏了一个非类型名,int s=0;/全局变量void func()class s/;/类名s隐藏了全局变量s s a;:s=3;/class s作用域结束int g=s;/用全局变量s给变量g初始化,哈尔滨工程大学计算机科学与技术学院,例:一个名字不能同时指两种类型,class C/;typedef int C;,/错误:又定义一个类型取同名,哈尔滨工程大学计算机科学与技术学院,例:非类型名不能重名,Student a;void a();,/error:函数名与对象名同名,非类型名
6、:变量名、常量名、函数名、对象名或枚举成员,哈尔滨工程大学计算机科学与技术学院,例:非类型名与类型名相同,int f;class f/;class f g;,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,对象的生存期,含义对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。分类静态生存期动态生存期,哈尔滨工程大学计算机科学与技术学院,/文件作用域,i具有静态生存期,这种生存期与程序的运行期相同。在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static。例:,静态生存期,#includeint
7、 i=5;int main()couti=iendl;return 0;,哈尔滨工程大学计算机科学与技术学院,块作用域中声明的,没有用static修饰的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。例:,动态生存期,#includevoid fun();void main()fun();fun();void fun()static int a=1;int i=5;a+;i+;couti=i,a=aendl;,运行结果:i=6,a=2i=6,a=3,i是动态生存期,a是静态生存期,哈尔滨工程大学计算机科学与技术学院,例:变量的生存期与
8、可见性,#includeint i=1;void main(void)static int a;int b=-10;int c=0;void other(void);cout-MAIN-n;cout i:i a:a b:b c:cendl;c=c+8;other();cout-MAIN-n;cout i:i a:a b:b c:cendl;i=i+10;other();,/i 为全局变量,具有静态生存期。,/静态局部变量,有全局寿命,局部可见。,/b,c为局部变量,具有动态生存期。,哈尔滨工程大学计算机科学与技术学院,例:变量的生存期与可见性,void other(void)static in
9、t a=2;static int b;int c=10;a=a+2;i=i+32;c=c+5;cout-OTHER-n;cout i:i a:a b:b c:cendl;b=a;,/a,b为静态局部变量,具有全局寿命,局部可见。只第一次进入函数时被初始化。,/C为局部变量,具有动态生存期,每次进入函数时都初始化。,运行结果:-MAIN-i:1 a:0 b:-10 c:0-OTHER-i:33 a:4 b:0 c:15-MAIN-i:33 a:0 b:-10 c:8-OTHER-i:75 a:6 b:4 c:15,哈尔滨工程大学计算机科学与技术学院,例:具有静动态生存期对象的程序,#includ
10、eclass Clock/时钟类声明public:/外部接口Clock();void SetTime(int NewH,int NewM,int NewS);void ShowTime();Clock()private:/私有数据成员int Hour,Minute,Second;,/三个形参均具有函数原型作用域,哈尔滨工程大学计算机科学与技术学院,例:具有静动态生存期对象的程序,/时钟类成员函数实现Clock:Clock()/构造函数Hour=0;Minute=0;Second=0;void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;
11、Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Secondendl;,哈尔滨工程大学计算机科学与技术学院,例:具有静动态生存期对象的程序,Clock globClock;void main()coutFirst time output:endl;globClock.ShowTime();globClock.SetTime(8,30,30);Clock myClock(globClock);coutSecond time output:endl;myClock.ShowTime();/引用具有块作用域的对象,/globC
12、lock具有静态生存期,文件作用域,/对象的成员函数具有类作用域,/声明具有块作用域的对象myClock,运行结果:First time output:0:0:0Second time output:8:30:30,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,数据与函数,数据存储在局部对象中,通过参数传递实现共享函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。,哈尔滨工程大学计算机科学与技术学院,使用全局对象,#includeint global;void f()global=5;void g()coutglobalendl;int mai
13、n()f();g();return 0;,/输出“5”,哈尔滨工程大学计算机科学与技术学院,将函数与数据封装,#includeclass Application public:void f();void g();private:int global;void Application:f()global=5;void Application:g()coutglobalendl;,int main()Application MyApp;MyApp.f();MyApp.g();return 0;,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,静态成员,静态成员分类静态数据成
14、员静态成员函数静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外初始化,用(:)来指明所属的类。与正常的数据成员一样,静态数据成员访问权限也是受控的(公有的、私有的和受保护的),但可以为任何一个成员函数访问 作用域仅限于所在的类,哈尔滨工程大学计算机科学与技术学院,静态成员,静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态成员函数。,哈尔滨工程大学计算机科学与技术学院,例:静态成员,#include class CTestpublic:CTest()count+;CTest()-count;sta
15、tic int getcount()return count;private:static int count;int CTest:count=0;void main(void)coutCTest:getcount()“object existn”;CTest test1;CTest*ptest=new CTest;coutCTest:getcount()“object existn”;delete ptest;coutCTest:getcount()“object existn”;,运行结果:0 object exist2 object exist1 object exist,哈尔滨工程大学
16、计算机科学与技术学院,例:具有静态数据成员的 Point类,#include class Pointpublic:Point(int xx=0,int yy=0)X=xx;Y=yy;countP+;Point(Point,哈尔滨工程大学计算机科学与技术学院,例:具有静态数据成员的 Point类,Point:Point(Point,Point:GetC();,编译会出错!,运行结果:Point A,4,5 Object id=1Point B,4,5 Object id=2,在没有声明任何对象前,countP=0,如何输出它?,哈尔滨工程大学计算机科学与技术学院,例:静态成员函数举例,#incl
17、udeclass Application public:static void f();static void g();private:static int global;int Application:global=0;,void Application:f()global=5;void Application:g()coutglobalendl;int main()Application:f();Application:g();return 0;,哈尔滨工程大学计算机科学与技术学院,例:静态成员函数举例,class A public:static void f(A a);private:i
18、nt x;void A:f(A a)coutx;couta.x;,/对x的引用是错误的,x不是静态数据成员,/正确,哈尔滨工程大学计算机科学与技术学院,例:具有静态成员的 Point类,#include class Point/Point类声明public:/外部接口Point(int xx=0,int yy=0)X=xx;Y=yy;countP+;Point(Point,哈尔滨工程大学计算机科学与技术学院,例:具有静态成员的 Point类,Point:Point(Point/输出对象号,类名引用,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,常类型的对象必须进行初始
19、化,而且不能被更新。常引用:被引用的对象不能被更新。const 类型说明符&引用名常对象:声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。类名 const 对象名常数组:数组元素不能被更新。类型说明符 const 数组名大小常指针:指向常量的指针。,常类型,哈尔滨工程大学计算机科学与技术学院,例:常引用做形参,#includevoid display(const double,哈尔滨工程大学计算机科学与技术学院,例:常对象举例,class Apublic:A(int i,int j)x=i;y=j;.private:int x,y;A const a(3,4);,/a是常对象,不
20、能被更新,哈尔滨工程大学计算机科学与技术学院,用const修饰的对象成员,常成员函数使用const关键字说明的函数。常成员函数不更新对象的数据成员。常成员函数说明格式:类型说明符 函数名(参数表)const;这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。const关键字可以被用于参与对重载函数的区分通过常对象只能调用它的常成员函数常数据成员使用const说明的数据成员。构造函数只能通过初始化列表对该数据成员进行初始化。,哈尔滨工程大学计算机科学与技术学院,例:常成员函数举例,#includeclass Rpublic:R(int r1,int r2)R1=r1
21、;R2=r2;void print();void print()const;private:int R1,R2;void R:print()coutR1:R2endl;void R:print()const coutR1;R2endl;void main()R a(5,4);a.print();R const b(20,52);b.print();,/调用void print(),/调用void print()const,哈尔滨工程大学计算机科学与技术学院,例:常数据成员举例,#includeclass Apublic:A(int i);void print();const int,哈尔滨工程大学计算机科学与技术学院,例:常数据成员举例,const int A:b=10;A:A(int i):a(i),r(a)void A:print()couta:b:rendl;void main()/*建立对象a1和a2,并以100和0作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值*/A a1(100),a2(0);a1.print();a2.print();,