当前位置:首页 >> 学科竞赛 >>

(C++完整PPT课件)


第五章 C++程序的结构

本章主要内容
? ? ? ? ? ?

作用域与可见性

对象的生存期
数据与函数 静态成员 共享数据的保护 友元

?
?

编译预处理命令
多文件结构和工程

第五章 C++程序的结构

r />
5.1 面向对象程序的结构

5.1.1 作用域和生存期 1. 作用域 1) 函数原型作用域 函数原型作用域开始于函数原型声明的左括号“(”,结 束于右括号“)”。例如: double Area(double length, double width); 函数原型作用域是C++程序中最小的作用域。 由于形参 length 和 width 只在括号之内有效,在程序的 其它地方无法引用这个标识符,如果要引用,必须重新定义。 因此,这里的标识符length和width实际上是可有可无的,省 去它,也决不会影响到程序的编译和运行结果。例如: double Area(double, double);

第五章 C++程序的结构

2) 块作用域 块作用域又称局部作用域。由一对花括号“{ }”所括起来 的块中声明的标识符的作用域从声明处开始,一直到块结束 的花括号为止。例如: #include<iostream.h> void main( ) { void fun1( ) ; int n; for( int i=0 ; i<5; i++ ) { int m ; if( i%2 ) n++ ; } m = n/2 ; n=i; fun1( ) ; }

//错误,m未定义 //fun1( )函数调用

第五章 C++程序的结构

void fun1( ) { cout<<"i="<<i<<endl ; }

//错误,i未定义

编译时,函数fun1( )中的语句: cout<<"i="<<i<<endl; 将出现一个未定义错误,这是因为块作用域不能延伸到子函数 中。

第五章 C++程序的结构 3) 文件作用域 #include<iostream.h> int k; void main() { k=5; {k++; } { int k=7; k++; cout<<"k="<<k; } cout<<“, k="<<k<<endl; } 程序运行结果为:k=8, k=6

可见性遵循的一般规则: (1) 标识符在引用前必须先声明。 (2) 在互相没有包含关系的不同作用域中声明同名的标识符时, 两标识符互不影响。 (3) 如果在两个或多个具有包含关系的作用域中声明了同名标识 符,则外层标识符在内层不可见。

第五章 C++程序的结构

2.生存期

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

第五章 C++程序的结构

3.局部变量和全局变量
1) 局部变量 局部变量包括自动(auto)变量、内部静态(static)变量和 函数参数。 2) 全局变量 全局变量具有文件作用域。

第五章 C++程序的结构 //EX5_1.cpp : 演示局部变量和全局变量 #include<iostream.h> int i = 1 ; //全局变量i: 静态生存期 void main( ) { static int a ; //声明局部静态变量a: 静态生存期 int b = -10 ; //声明局部变量b: 局部生存期 int c = 0 ; //声明局部变量c: 局部生存期 void other( void ) ; //声明函数other( ) cout<<“ main: "<<"i="<<i<<" a="<<a<<" b="<<b<<" c=" <<c<<endl ; c=c+8; other( ) ; //调用函数other( ) cout<<“ main: "<<"i="<<i<<" a="<<a<<" b="<<b <<" c="<<c<<endl; other( ); //调用函数other( ) }

第五章 C++程序的结构 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="<<a<<" b= "<<b <<" c="<<c<<endl; b=a; } 程序运行结果为: main: i=1 a=0 b=-10 other: i=3 a=4 b= 0 main: i=3 a=0 b=-10 other: i=5 a=7 b= 4 c=0 c=10 c=8 c=10

第五章 C++程序的结构

5.1.2 静态成员

静态成员为同类的所有对象共同拥有,用于解决同类对 象之间数据和函数的共享问题。静态成员分为静态数据成员 和静态函数成员。 (1) 静态数据成员声明:static int n (2) 静态数据成员必须要在类外进行初始化,初始化的形式为: <类型标识符> <类名>::<静态数据成员名>=<值> 例如:int Point::n = 0 ; (3) 静态成员属于类,而不属于任何一个对象; (4) 静态成员一样要服从访问控制限制; (5) 私有静态数据成员只能在类内引用,公有或保护静态数据 成员可以在类外通过类名引用。 (6) 静态函数成员可以直接引用该类的静态成员,但不能直接 引用非静态数据成员; (7) 公有静态函数成员可以通过类名或对象名来调用。

第五章 C++程序的结构 //EX5_2.cpp : 演示使用静态成员 #include<iostream.h> class point { private: int x , y ; static int countP ; //声明私有静态数据成员 public: point( int xx=0, int yy=0 ) //定义构造函数 { x=xx ; y=yy ; countP++ ; } point( point &p ) ; //声明拷贝构造函数 int get_x( ) { return x ; } int get_y( ) { return y ; } static void get_c( ) //定义公有静态函数成员 { cout<<“Object id=”<<countP<<endl ; } //私有静态数据成 }; //员在类内引用

第五章 C++程序的结构

point::point( point &p ) { x = p.x ; y = p.y ; countP++ ; }
int point::countP = 0 ;

//定义拷贝构造函数

//私有静态数据成员在类内引用
//静态数据成员必须要在类外初始化

void main( ) { point::get_c( ) ; //第1次通过类名调用静态函数成员 point a( 4, 5 ) ; //声明类的对象a cout<<"point a,"<<a.get_x( )<<","<<a.get_y( ); a.get_c( ) ; //第2次通过对象名调用静态函数成员 point b( a ) ; cout<<"point b,"<<b.get_x( )<<","<<b.get_y( ) ; point::get_c( ); //第3次通过类名调用静态函数成员 }

第五章 C++程序的结构

在主函数中,分别采用类名和对象名来调用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

第五章 C++程序的结构

5.1.3 友元 1. 友元函数
声明友元函数是为了使普通函数或其它类的成员函数能 访问本类的成员,友元函数在类声明中由关键字friend修饰。 普通函数声明为友元函数的形式: friend <类型标识符> <友元函数名>(参数表) 其它类的成员函数声明为友元函数的形式: friend <类型标识符> <类名>::<友元函数名>(参数表) 说明: (1) 友元函数的声明可以在类声明中的任何位置,既可在 public区,也可在protected区,意义完全一样。 (2) 友元函数的定义一般放在类的外部,最好与类的其他 成员函数定义放在一起。

第五章 C++程序的结构

//EX5_3.cpp : 演示使用普通函数作友元函数计算两点距离
#include<iostream.h> #include<math.h> class point { private: double x, 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的友元

第五章 C++程序的结构

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( ) { point myp1(1,1), myp2(4,5) ; //声明point类对象myp1和myp2 cout<<"The distance is:"<<distance(myp1, myp2)<<endl; }

第五章 C++程序的结构

2. 友元类
如果友元是一个类,则称为友元类。友元类的声明形式为: friend class <友元类名> 说明: (1) 友元类的声明同样可以在类声明中的任何位置; (2) 友元类的所有成员函数都成为友元函数。 例如,若A类为B类的友元类,即在B类中声明: friend class A ; 则A类的所有成员函数都成为B类的友元函数,都可以访问B类 的私有和保护成员。

第五章 C++程序的结构

友元类的成员函数可以通过对象名直接访问到隐藏的数据, 达到高效协调工作的目的。但在使用友元时还有两点需要注意: (1) 友元关系不能传递 。 B 类是 A 类的友元, C 类是 B 类的友 元, C类和 A类之间如果没有声明,就没有任何友元关系, 不能进行数据共享。 (2) 友元关系是单向的。如果声明 B类是 A类的友元, B类的成 员函数就可以访问 A类的私有和保护数据,但 A类的成员函 数却不能访问B类的私有和保护数据。

第五章 C++程序的结构

5.1.4 常类型 1. 常引用 使用const关键字声明的引用称为常引用,常引 用所引用的对象不能被更新。用常引用做形参,不 会发生对实参意外的更改。 常引用的声明形式为 const <类型标识符> &<引用名> 注意:常引用的值不能被更新,所以常引用声明时, 必须同时进行初始化。

第五章 C++程序的结构 //EX5_4.cpp : 演示常引用做形参 #include<iostream.h>

void display( const double &r ) ; //常引用做形参 { cout<<“r=”<<++r<<endl ;} //错误:更改常引用的对象r
void main( ) { double d( 6.5 ) ; display( d ) ; } 这段程序编译时有一个错误: error C2166: 1-value specifies const object。 如果将display函数的定义语句改为: cout<<"r="<<r<<endl; 则得程序运行结果为: r=6.5

第五章 C++程序的结构

2. 常对象
使用const关键字声明的对象称为常对象。常对象的声明 形式为 const <类名> <对象名> 或 <类名> const <对象名> 声明常对象的同时,也要进行初始化,而且该对象以后 不能再被更新。

3. 常成员函数
使用 const 关键字声明的函数称为常成员函数,常成员 函数声明的形式为 <类型标识符> <函数名>(参数表) const;

第五章 C++程序的结构

说明: (1) const是加在函数声明后面的类型修饰符,它是函数 类型的一个组成部分,因此在实现部分也要带const关键字。 (2) const关键字可以被用于对重载函数的区分,例如, 可以在类中这样声明: void fun( ) ; void fun( ) const ; (3) 常成员函数不能更新对象的数据成员,也不能调用该 类中没有用const修饰的成员函数。 (4) 常对象只用于调用它的常成员函数,而不能调用其他 成员函数。

第五章 C++程序的结构 //EX5_5.cpp : 演示常成员函数 #include<iostream.h> class A { private: int x , y ; public: A ( int i=0, int j=0 ) { x=i ; y=j ;} void fun( ) //定义普通成员函数 { cout<<"成员函数:x="<<x<<", y="<<y<<endl ; } void fun( ) const //定义常成员函数 { cout<<"常成员函数:x="<<x<<", y="<<y<<endl ; } }; void main( ) { A obj1( 1, 2 ) ; obj1.fun( ) ; const A obj2( 3, 4 ) ; obj2.fun( ) ; } //声明普通对象obj1 //调用普通成员函数 //声明常对象obj2 //调用常成员函数

第五章 C++程序的结构

程序运行结果为: 成员函数:x=1, y=2 常成员函数:x=3, y=4

4. 常数据成员
常数据成员也用关键字const说明,常数据成员(包括常 引用、常对象)由于不能被更新,因此只能用成员初始化列 表的方式通过构造函数进行初始化。

第五章 C++程序的结构

//EX5_6.cpp : 演示常数据成员
#include<iostream.h> class A { private: const int x ; //常数据成员x static const int y ; //静态常数据成员y public: const int &r ; //常引用r A ( int i ) : x ( i ), r ( x ) { } //x和r用初始化列表获得初值 void fun( ) { cout<<"x="<<x<<", y="<<y<<", r="<<r<<endl ; } };

const int A::y=5 ;

//y的初始化在类外进行

第五章 C++程序的结构

void main( ) { A obj1(1), obj2(2); obj1.fun( ); obj2.fun( ); }
程序运行结果为: x=1, y=5, r=1 x=2, y=5, r=2

第五章 C++程序的结构

5.1.5 多文件结构
大型程序通常由多个文件组成一个项目(Project),理由 是:

1. 将相关类和函数放在一个特定的文件中,对不同的文件进行
单独编写、编译,最后再链接,避免重复劳动,提高工作效益。 2. 便于团队开发。按逻辑功能将程序分解成多个源文件,使程

序容易管理,便于程序员的任务安排。
大型程序基本上由三个部分构成:

类的声明:
主函数:

通常做成 .h文件

(Header Files)

类成员的实现:通常做成 . cpp文件(Source Files) 通常做成 . cpp文件(Source Files)

第五章 C++程序的结构

5.2 动态内存分配
5.2.1 new运算符 new运算符用于动态分配一块内存空间。使用形式为: 指针变量 = new <数据类型> [长度] 例如分配一个可以容纳256个char型数据的空间: char *Cbuffer = new char [256] ;

使用new运算符时,需要注意: (1) 如果分配的空间长度为1个单位,则可以省略[ ]和其中的整 数,例如: float *pNum=new float ;与 float *pNum=new float[1];等价。

第五章 C++程序的结构

(2) 使用new运算符分配内存空间时,其空间长度可以是变量, 也可以是数值表达式,例如分配一个可以容纳10个int型数 据的空间: int nSize = 5 ; int *nPInt = new int[nSize+5]; (3) 由new分配的内存空间是连续的,可以通过指针的变化访问 所分配空间的每一个元素,例如: int *nPInt = new int[10]; nPInt[5]=100; 或 *(nPInt+5)=100; (4) 如果当前存储器无足够的内存空间可分配,则new运算符返 回0 ( NULL )。

第五章 C++程序的结构

5.2.2 delete运算符
由new运算符分配的内存空间在使用完毕后应该使用delete 运算符释放。delete运算符的使用有两种形式: delete指针 或 delete [ ]指针 例如:int *pInt = new int ; delete pInt ; int *pManyInt=new int[10] ; delete [ ] pManyInt ; 使用delete运算符时,需要注意: (1)用new运算符获得的内存空间,只许使用一次delete,不允许 多次对同一块空间进行多次释放,否则将会产生严重错误。 (2) delete只能用来释放由new运算符分配的动态内存空间,不得 使用delete运算符去释放程序中的变量、数组的存储空间。

第五章 C++程序的结构

5.2.3 动态内存分配的应用实例
1.链表概述 链表是一种动态数据结构,它的特点是用一组任意的存 储单元 ( 可以是连续的,也可以是不连续的 ) 存放数据元素。 一个简单的链表具有下图所示的结构形式。
头 指 针 head a1 a2 a3 … an ∧

定义单链表结构的最简单形式为: struct Node { int data; Node *next; };

第五章 C++程序的结构

定义一个链表类List,其中包含链表结点的插入、删除、 访问等功能的成员函数,以便对链表进行操作。
class List { Node *head; //声明一个链表结构指针 public: List( ) { head = NULL ; } void InsertList ( int aData , int bData ) ;//链表结点的插入 void DeleteList ( int aData ) ; //链表结点的删除 void OutputList ( ) ; //链表结点的访问 Node *Gethead( ) { return head ; } };

第五章 C++程序的结构

2.链表结点的访问
void List::OutputList( ) { Node *current = head ; while ( current != NULL ) { cout<<current->data<<“ ” ; current = current->next ; } cout<<endl ; } //链表结点的访问 //建立链表头指针 //如果链表存在, //显示链表结点的数据 //指向下一个结点

3.链表结点的插入
如果要将新结点 b插入到链表的结点 a之前,则需要考虑 下列几种情况:

第五章 C++程序的结构 (1) 插入前链表是一个空表,插入新结点b后,链表如图 (a)所 示。 (2) 若a是链表的第一个结点,插入新结点b后成为第一个结点, 如图 (b)所示。若a不是链表的第一个结点,则要先找出a的 上一个结点ak,然后新结点b插到结点ak 与a之间,如图 (c) 所示。 (4) 若链表中不存在a,则新结点b插在最后,如图 (d)所示。
head head b ∧ b (a) … ak b (c) (d) a … … (b) an b ∧ a …

第五章 C++程序的结构

//设aData是结点a中的数据,bData是新结点b中的数据
void List::InsertList( int aData , int bData ) { Node *p , *q , *s ; s = ( Node* ) new Node ; //动态分配一个新结点存储区 s->data = bData ; //将新结点b的数据放入新存储区 p = head ; //结点指针p指向链表头 if ( head == NULL ) //若是空表, { head = s ; //将新存储区的地址赋给表头,即使 s->next = NULL ; //新结点b作为第一个结点 } else //若不是空表 if( p->data == aData ) //若a是第一个结点 { head = s; //使新结点b作为第一个结点 s->next = p; //将结点a接到新结点b的后面 }

第五章 C++程序的结构

else //若a不是第一个结点 { while( p->data != aData && p->next != NULL) //找结点a { q=p; //使q指向p所指的结点 p = p->next ; // p本身指向下一个结点 } if( p->data == aData ) //若有结点a,则q指向的是ak { q->next = s ; //将新结点b插入结点ak之后 s->next = p ; //将结点a排在新结点b之后 } else //若没有结点a { p->next = s ; //将新结点b排在链表末尾,即 s->next = NULL ; //将新存储区排在链表末尾。 } }
}

第五章 C++程序的结构

4.链表结点的删除
要在链表中删除结点a,并释放被删除的结点所占的存储空 间,需要考虑下列几种情况: (1) 若要删除的结点a是第一个结点,则把head指向a的下一个 结点,如图 (a)所示。 (2) 若要删除的结点 a不是第一个结点,则应使a的上一结点ak-1 的指针域指向a的下一个结点ak+1,如图 (b)所示。 (3) 若空表或要删除的结点a不存在,则不作任何改变。
head a a1 (a) ak-1 ak (b) ak+1

第五章 C++程序的结构

//设aData是要被删除结点a中的数据成员 void List::DeleteList ( int aData ) { Node *p , *q ; p = head ; if ( p == NULL ) return ; //若p为空,则返回 if ( p->data == aData ) //若a是第一个结点 { head = p->next; //链表头指向下一个结点 delete p ; //删除结点a } else //若a不是第一个结点 {

第五章 C++程序的结构

while( p->data != aData && p->next != NULL) //找结点a { q=p; //使q指向p所指的结点 p = p->next ; // p本身指向下一个结点 } if ( p->data == aData ) //若有结点a { q->next = p->next; //链接ak-1和ak+1 delete p ; //删除结点a }
} }

第五章 C++程序的结构

[例5-7] 利 用 链 表 操 作 类 List 的 成 员 函 数 InsertList 、 DeleteList 、 OutputList ,采用多文件结构,实现对 链表的插入、删除和输出操作。 链表结点结构体Node、链表操作类List及其成员 函 数 InsertList 、 DeleteList 、 OutputList 均 在 EX5_7.h文件中定义。 链表的插入、删除和输出操作在EX5_7.cpp文件 中实现。 EX5_7.h 和 EX5_7.cpp文件在 EX5_7项目中联编。

第五章 C++程序的结构

//EX5_7.cpp : 演示对链表的插入、删除和访问(输出)操作
#include "EX5_7.h" void main( ) { List A, B ; //定义两个链表对象 int data[10] = { 25, 41, 16, 98, 5, 67, 9, 55, 1, 121 } ; A.InsertList( 0, data[0] ) ; //建立链表A首结点 for(int i = 1 ; i<10 ; i++) A.InsertList( 0 , data[i] ) ; //顺序向后插入 cout<<"\n链表 A: "; A.OutputList( ) ; //显示链表A A.DeleteList( data[7] ); //删除结点7 cout<<"删除元素data[7]后:" ; A.OutputList( ) ; //显示删除结点7后的链表A

第五章 C++程序的结构

B.InsertList( 0, data[0] ) ; //建立链表B首结点 for( i=1; i<10; i++ ) //在首结点处顺序向前插入 B.InsertList( B.Gethead( )->data, data[i] ) ; cout<<"\n链表 B: "; B.OutputList( ) ; //显示链表B B.DeleteList( 67 ) ; //删除结点元素67 cout<<"删除元素67后:"; B.OutputList( ) ; //显示删除元素67后的链表B
}

程序运行结果为: 链表A: 25 41 删除元素data[7]后:25 41 链表B: 121 1 删除元素67后: 121 1

16 16 55 55

98 5 67 9 98 5 67 9 9 67 5 98 9 5 98 16

55 1 121 1 121 16 41 25 41 25


相关文章:
第1 章 认识
4页 免费 (C++完整PPT课件) 第 1 章... 43页 免费 第六章第一节(怎样认识力)... 5页 免费 第1章_三角形的初步认识 2页 免费喜欢...
【分享】【大学各门课精品PPT课件,PDF课件】
[PPT 讲稿]《量子力学》经典 PPT 课件(北京大学,一共含 546 张 PPT) [文档资料]ImageProcess《数字图像处理》完整 WORD 讲稿 [PPT 讲稿]C++完整 PPT 课件(配...
C++课件 第8章 泛型2
(C++完整PPT课件) 第 10 章... 24页 免费 C#2.0中的泛型学习 4页 2财富值 2 泛型 52页 1财富值喜欢此文档的还喜欢 C++课件 第7章 泛型1 13页 免费 ...
Ajasgq【分享】【大学各门课精品PPT课件,PDF课件】
[PPT 讲稿]C++完整 PPT 课件(配合自学效果很好) [PPT 讲稿]《C++程序设计实践教程》配套 PPT 课件(华中科技大学 出版社,马光志) [PPT 讲稿]AutoCAD 2006 标准...
c++课件
搜 试试 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 高等教育 理学...一年级语文ZCS课件 40页 免费 c++基本知识点 4页 2财富值如要投诉违规内容,请到...
C++课件 第7章 泛型1
29页 20财富值 (C++完整PPT课件) 第 10 章... 24页 免费 泛型1 暂无评价 8页 5财富值喜欢此文档的还喜欢 C++泛型编程:源起、实现与... 7页 免费 C++...
C++课件 考试必备
关键词:C++考试必备 1/2 相关文档推荐 塑料课件(全)考试必备 46页 5财富值 ...行政法课件 考试必备 547页 2财富值 运动生物化学考试必备PPT课... 44页 20...
C++课件
搜 试试 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 高等教育 工学...C课件第05讲 29页 5财富值 C课件第05讲 29页 10财富值 C++课件——c__1...
C++课件 第13章 异常处理
java课件第9章(9.1异常处理... 27页 免费 (C++完整PPT课件) 第 12 章... 12页 免费 java课件08异常处理 34页 2财富值喜欢此文档的还喜欢 第十五章 C++之...
C++学习笔记
(C++完整PPT课件) 第 4 章... 36页 免费 高质量C++编程指南(林锐 ) 101页 1财富值 c++经典代码大全 69页 免费 C++串讲笔记 6页 免费如要投诉违规内容,请...
更多相关标签:
松鼠ppt课件完整版 | 有理数ppt课件完整版 | 长城ppt课件完整版 | 林海ppt课件完整版 | 颐和园ppt课件完整版 | 有限元法课件完整ppt | 老舍猫ppt课件完整版 | c语言ppt课件 |