第3章-5C程序的结构.ppt

上传人:本田雅阁 文档编号:3426092 上传时间:2019-08-24 格式:PPT 页数:47 大小:792.04KB
返回 下载 相关 举报
第3章-5C程序的结构.ppt_第1页
第1页 / 共47页
第3章-5C程序的结构.ppt_第2页
第2页 / 共47页
第3章-5C程序的结构.ppt_第3页
第3页 / 共47页
第3章-5C程序的结构.ppt_第4页
第4页 / 共47页
第3章-5C程序的结构.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《第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、的标识符在内层不可见。,哈尔滨工程大学计算机科学与技术学院,同一作用域中的同名标识符,在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。 重载的函数可以有相同的函数名。,哈尔滨工程大学计算机科学与技术学院,例:文件作用域与块作用域,#include int i; int main() i=5; int i; i=7; cout“i=“iendl; cout“i=“i; return 0; ,/文件作用域,/块作用域,/输出7,/输出5,哈尔滨工程大学计算机科学与技术学院,例:非类型名隐藏类型名,Class Sample /定义类 / ; void func(int Sam

5、ple) /函数形参隐藏了类名 class Sample a; /定义一个对象要用到类名 Sample+; /形参的算术运算 / ,类名被函数的形参覆盖,函数内定义类对象,需加前缀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;,/错误:又定义一个

6、类型取同名,哈尔滨工程大学计算机科学与技术学院,例:非类型名不能重名,Student a; void a( );,/error:函数名与对象名同名,非类型名:变量名、常量名、函数名、对象名或枚举成员,哈尔滨工程大学计算机科学与技术学院,例:非类型名与类型名相同,int f; class f / ; class f g;,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,对象的生存期,含义 对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。 分类 静态生存期 动态生存期,哈尔滨工程大学计算机科学与技术学院,/文件作用域,i具有静态生

7、存期,这种生存期与程序的运行期相同。 在文件作用域中声明的对象具有这种生存期。 在函数内部声明静态生存期对象,要冠以关键字static 。 例:,静态生存期,#include int i=5; int main() cout“i=“iendl; return 0; ,哈尔滨工程大学计算机科学与技术学院,块作用域中声明的,没有用static修饰的对象是动态生存期的对象(习惯称局部生存期对象)。 开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。 例:,动态生存期,#include void fun(); void main() fun(); fun(); void fun() stat

8、ic int a=1; int i=5; a+; i+; cout“i=“i“,a=“aendl; ,运行结果: i=6, a=2 i=6, a=3,i是动态生存期,a是静态生存期,哈尔滨工程大学计算机科学与技术学院,例:变量的生存期与可见性,#include int 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:

9、“i“ a: “a“ b: “b“ c: “cendl; i=i+10; other(); ,/ i 为全局变量,具有静态生存期。,/ 静态局部变量,有全局寿命,局部可见。,/ b, c为局部变量,具有动态生存期。,哈尔滨工程大学计算机科学与技术学院,例:变量的生存期与可见性,void other(void) static int 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为静态局部变量,具有全局寿命,局部

10、可见。 只第一次进入函数时被初始化。,/ 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,哈尔滨工程大学计算机科学与技术学院,例:具有静动态生存期对象的程序,#include class Clock /时钟类声明 public: /外部接口 Clock(); void SetTime(int NewH, int NewM, int New

11、S); 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; Minute=NewM; Second=NewS; void Clock:ShowTime() coutHour“:“

12、Minute“:“Secondendl;,哈尔滨工程大学计算机科学与技术学院,例:具有静动态生存期对象的程序,Clock globClock; void main() cout“First time output:“endl; globClock.ShowTime(); globClock.SetTime(8,30,30); Clock myClock(globClock); cout“Second time output:“endl; myClock.ShowTime(); /引用具有块作用域的对象 ,/globClock具有静态生存期,文件作用域,/对象的成员函数具有类作用域,/声明具有块

13、作用域的对象myClock,运行结果: First time output: 0:0:0 Second time output: 8:30:30,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,数据与函数,数据存储在局部对象中,通过参数传递实现共享函数间的参数传递。 数据存储在全局对象中。 将数据和使用数据的函数封装在类中。,哈尔滨工程大学计算机科学与技术学院,使用全局对象,#include int global; void f() global=5; void g() coutglobalendl; int main() f(); g(); return 0; ,/输

14、出“5”,哈尔滨工程大学计算机科学与技术学院,将函数与数据封装,#include class 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; ,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,静态成员,静态成员分类 静态数据成员 静态成员

15、函数 静态数据成员 用关键字static声明 该类的所有对象维护该成员的同一个拷贝 必须在类外初始化,用(:)来指明所属的类。 与正常的数据成员一样,静态数据成员访问权限也是受控的(公有的、私有的和受保护的),但可以为任何一个成员函数访问 作用域仅限于所在的类,哈尔滨工程大学计算机科学与技术学院,静态成员,静态成员函数 类外代码可以使用类名和作用域操作符来调用静态成员函数。 静态成员函数只能引用属于该类的静态数据成员或静态成员函数。,哈尔滨工程大学计算机科学与技术学院,例:静态成员,#include class CTest public: CTest( )count+; CTest () -c

16、ount; static 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 exist 2 objec

17、t exist 1 object exist,哈尔滨工程大学计算机科学与技术学院,例:具有静态数据成员的 Point类,#include class Point public: 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=1 Point B,4,5 Object id=2,在没有声明任何对象前,countP=0,

18、如何输出它?,哈尔滨工程大学计算机科学与技术学院,例:静态成员函数举例,#include class 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; ,哈尔滨工程大学计算机科学与技术

19、学院,例:静态成员函数举例,class A public: static void f(A a); private: int 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类,Poi

20、nt:Point(Point /输出对象号,类名引用 ,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,常类型的对象必须进行初始化,而且不能被更新。 常引用:被引用的对象不能被更新。 const 类型说明符 &引用名 常对象:声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。 类名 const 对象名 常数组:数组元素不能被更新。 类型说明符 const 数组名大小 常指针:指向常量的指针。,常类型,哈尔滨工程大学计算机科学与技术学院,例:常引用做形参,#include void display(const double ,哈尔滨工程大学计算机科学与技术学院

21、,例:常对象举例,class A public: A(int i,int j) x=i; y=j; . private: int x,y; ; A const a(3,4);,/a是常对象,不能被更新,哈尔滨工程大学计算机科学与技术学院,用const修饰的对象成员,常成员函数 使用const关键字说明的函数。 常成员函数不更新对象的数据成员。 常成员函数说明格式: 类型说明符 函数名(参数表)const; 这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。 const关键字可以被用于参与对重载函数的区分 通过常对象只能调用它的常成员函数 常数据成员 使用const

22、说明的数据成员。构造函数只能通过初始化列表对该数据成员进行初始化。,哈尔滨工程大学计算机科学与技术学院,例:常成员函数举例,#include class R public: R(int r1, int r2)R1=r1;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.prin

23、t(); ,/调用void print(),/调用void print() const,哈尔滨工程大学计算机科学与技术学院,例:常数据成员举例,#include class A public: 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(); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1