C++优秀课件第05章C++程序的结构

上传人:E**** 文档编号:90582922 上传时间:2019-06-13 格式:PPT 页数:42 大小:195.50KB
返回 下载 相关 举报
C++优秀课件第05章C++程序的结构_第1页
第1页 / 共42页
C++优秀课件第05章C++程序的结构_第2页
第2页 / 共42页
C++优秀课件第05章C++程序的结构_第3页
第3页 / 共42页
C++优秀课件第05章C++程序的结构_第4页
第4页 / 共42页
C++优秀课件第05章C++程序的结构_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C++优秀课件第05章C++程序的结构》由会员分享,可在线阅读,更多相关《C++优秀课件第05章C++程序的结构(42页珍藏版)》请在金锄头文库上搜索。

1、本章主要内容,作用域与可见性 对象的生存期 数据与函数 静态成员 共享数据的保护 友元 编译预处理命令 多文件结构和工程,5.1 面向对象程序的结构,5.1.1 作用域和生存期 1. 作用域 1) 函数原型作用域 函数原型作用域开始于函数原型声明的左括号“(”,结束于右括号“)”。例如: double Area(double length, double width); 函数原型作用域是C+程序中最小的作用域。 由于形参length和width只在括号之内有效,在程序的其它地方无法引用这个标识符,如果要引用,必须重新定义。因此,这里的标识符length和width实际上是可有可无的,省去它,也

2、决不会影响到程序的编译和运行结果。例如: double Area(double, double);,块作用域又称局部作用域。由一对花括号“ ”所括起来的块中声明的标识符的作用域从声明处开始,一直到块结束的花括号为止。例如: #include void main( ) void fun1( ) ; int n; for( int i=0 ; i5; i+ ) int m ; if( i%2 ) n+ ; m = n/2 ; /错误,m未定义 n = i ; fun1( ) ; /fun1( )函数调用 ,2) 块作用域,void fun1( ) cout“i=“iendl ; /错误,i未定义

3、编译时,函数fun1( )中的语句: cout“i=“iendl; 将出现一个未定义错误,这是因为块作用域不能延伸到子函数 中。,3) 文件作用域,#include int k; void main() k=5; k+; int k=7; k+; cout“k=“k; cout“, k=“kendl; 程序运行结果为:k=8, k=6 可见性遵循的一般规则: (1) 标识符在引用前必须先声明。 (2) 在互相没有包含关系的不同作用域中声明同名的标识符时, 两标识符互不影响。 (3) 如果在两个或多个具有包含关系的作用域中声明了同名标识 符,则外层标识符在内层不可见。,1) 静态生存期 静态生存

4、期与程序的运行期相同。具有文件作用域的变量具有静态生存期。如果要在函数内部的块作用域中声明具有静态生存期的变量,则要使用关键字static。 例如: static int k; 具有静态生存期的变量,也称为静态变量。 2) 局部生存期 在块作用域中声明的变量具有局部生存期。此生存期诞生于声明点,而终止于其作用域的结束处。具有局部生存期的变量都具有块作用域。但当在块作用域内将变量说明为静态变量时,该变量则具有静态生存期。 3) 动态生存期 动态生存期由程序中特定的函数 ( malloc( )和free( ) ) 调用或由操作符 ( new和delete ) 创建和释放。具有动态生存期的变量在内存

5、的堆区分配空间。,2生存期,3局部变量和全局变量,1) 局部变量 局部变量包括自动(auto)变量、内部静态(static)变量和函数参数。 2) 全局变量 全局变量具有文件作用域。,/EX5_1.cpp : 演示局部变量和全局变量 #include int i = 1 ; /全局变量i: 静态生存期 void main( ) static int a ; /声明局部静态变量a: 静态生存期 int b = -10 ; /声明局部变量b: 局部生存期 int c = 0 ; /声明局部变量c: 局部生存期 void other( void ) ; /声明函数other( ) cout“ mai

6、n: “i=“i“ a=“a“ b=“b“ c=“ cendl ; c = c + 8 ; other( ) ; /调用函数other( ) cout“ main: “i=“i“ a=“a“ b=“b “ c=“cendl; other( ); /调用函数other( ) ,void other( void ) static int a = 1 ; /局部静态变量a: 静态生存期 static int b ; /局部静态变量b: 静态生存期 int c = 5 ; /局部变量c: 局部生存期 i = i+2 ; a = a+3 ; c = c+5 ; cout“other: “i=“i“ a=

7、“a“ b= “b “ c=“cendl; b = a ; 程序运行结果为: main: i=1 a=0 b=-10 c=0 other: i=3 a=4 b= 0 c=10 main: i=3 a=0 b=-10 c=8 other: i=5 a=7 b= 4 c=10,静态成员为同类的所有对象共同拥有,用于解决同类对象之间数据和函数的共享问题。静态成员分为静态数据成员和静态函数成员。 (1) 静态数据成员声明:static int n (2) 静态数据成员必须要在类外进行初始化,初始化的形式为: := 例如:int Point:n = 0 ; (3) 静态成员属于类,而不属于任何一个对象;

8、 (4) 静态成员一样要服从访问控制限制; (5) 私有静态数据成员只能在类内引用,公有或保护静态数据 成员可以在类外通过类名引用。 (6) 静态函数成员可以直接引用该类的静态成员,但不能直接 引用非静态数据成员; (7) 公有静态函数成员可以通过类名或对象名来调用。,5.1.2 静态成员,/EX5_2.cpp : 演示使用静态成员 #include class point private: int x , y ; static int countP ; /声明私有静态数据成员 public: point( int xx=0, int yy=0 ) /定义构造函数 x=xx ; y=yy ;

9、countP+ ; point( point /员在类内引用,point:point( point /第3次通过类名调用静态函数成员 ,在主函数中,分别采用类名和对象名来调用get_c( )。 第1次调用get_c( )时由于还没有任何对象生成,只能采用 类名的形式。由此可见,通过类名调用静态函数成员可以输出 静态数据成员的初始值。 后面的2次get_c( )的调用既可以采用类名的形式,也可以 采用对象名的形式。 程序运行结果为: Object id = 0 point a, 4, 5 Object id=1 point b, 4, 5 Object id=2,声明友元函数是为了使普通函数或其

10、它类的成员函数能访问本类的成员,友元函数在类声明中由关键字friend修饰。 普通函数声明为友元函数的形式: friend (参数表) 其它类的成员函数声明为友元函数的形式: friend :(参数表) 说明: (1) 友元函数的声明可以在类声明中的任何位置,既可在public区,也可在protected区,意义完全一样。 (2) 友元函数的定义一般放在类的外部,最好与类的其他成员函数定义放在一起。,5.1.3 友元 1. 友元函数,/EX5_3.cpp : 演示使用普通函数作友元函数计算两点距离 #include #include class point private: double x,

11、 y ; public: point(double xx=0, double yy=0 ) x=xx; y=yy; double get_x( ) return x; double get_y( ) return y; friend double distance( point p1, point p2 ) ; /普通函数作 ; /point的友元,double distance( point p1, point p2 ) /定义point类的友元函数 return (sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); void main(

12、 ) point myp1(1,1), myp2(4,5) ; /声明point类对象myp1和myp2 cout“The distance is:“distance(myp1, myp2)endl; ,如果友元是一个类,则称为友元类。友元类的声明形式为: friend class 说明: (1) 友元类的声明同样可以在类声明中的任何位置; (2) 友元类的所有成员函数都成为友元函数。 例如,若A类为B类的友元类,即在B类中声明: friend class A ; 则A类的所有成员函数都成为B类的友元函数,都可以访问B类 的私有和保护成员。,2. 友元类,友元类的成员函数可以通过对象名直接访问

13、到隐藏的数据, 达到高效协调工作的目的。但在使用友元时还有两点需要注意: (1) 友元关系不能传递。B类是A类的友元,C类是B类的友 元,C类和A类之间如果没有声明,就没有任何友元关系,不能进行数据共享。 (2) 友元关系是单向的。如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。,使用const关键字声明的引用称为常引用,常引用所引用的对象不能被更新。用常引用做形参,不会发生对实参意外的更改。 常引用的声明形式为 const & 注意:常引用的值不能被更新,所以常引用声明时, 必须同时进行初始化。,5.1.4 常类型 1.

14、 常引用,/EX5_4.cpp : 演示常引用做形参 #include void display( const double 则得程序运行结果为: r=6.5,使用const关键字声明的对象称为常对象。常对象的声明形式为 const 或 const 声明常对象的同时,也要进行初始化,而且该对象以后不能再被更新。 3. 常成员函数 使用const 关键字声明的函数称为常成员函数,常成员函数声明的形式为 (参数表) const;,2. 常对象,说明: (1) const是加在函数声明后面的类型修饰符,它是函数类型的一个组成部分,因此在实现部分也要带const关键字。 (2) const关键字可以被

15、用于对重载函数的区分,例如,可以在类中这样声明: void fun( ) ; void fun( ) const ; (3) 常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。 (4) 常对象只用于调用它的常成员函数,而不能调用其他成员函数。,/EX5_5.cpp : 演示常成员函数 #include class A private: int x , y ; public: A ( int i=0, int j=0 ) x=i ; y=j ; void fun( ) /定义普通成员函数 cout“成员函数:x=“x“, y=“yendl ; void fun( ) const /定义常成员函数 cout“常成员函数:x=“x“, y=“yendl ; ; void main( ) A obj1( 1, 2 ) ; /声明普通对象obj1 obj1.fun( ) ; /调用普通成员函数 const A obj2( 3, 4 ) ; /声明常对象obj2 obj2.fun( ) ; /调用常成员函数 ,程序运行结果为: 成员函数:x=1, y=2 常成员函数:x=3, y=4 4. 常数据成员 常数据成员也用关键字const说明,常数据成员(包括常引用、常对象)由于不能被更新,因此只能用

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号