




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计(C+描述)成信院 李代伟面向对象程序设计(C+描述)成信院 李代伟本章主要内容本章主要内容l 第一节第一节 类与对象概述类与对象概述l 第二节第二节 C+程序的结构程序的结构面向对象程序设计(C+描述)成信院 李代伟第一节 类与对象概述面向对象程序设计(C+描述)成信院 李代伟l 面向对象的思想面向对象的思想 l 面向对象程序的基本特点面向对象程序的基本特点l 类的概念、声明和使用类的概念、声明和使用l 构造函数、拷贝构造函数定义和使用构造函数、拷贝构造函数定义和使用l 析构函数的定义和使用析构函数的定义和使用l 内联成员函数的定义和使用内联成员函数的定义和使用l 前向引用声
2、明前向引用声明l UML简介简介本节主要内容本节主要内容面向对象程序设计(C+描述)成信院 李代伟回顾:面向过程的设计方法回顾:面向过程的设计方法l重点重点:如何实现细节过程,将如何实现细节过程,将数据与函数分开数据与函数分开。l形式:形式:主模块主模块 + 若干个子模块(若干个子模块(main()+子函数)。子函数)。l特点:特点:自顶向下,逐步求精自顶向下,逐步求精功能分解。功能分解。l缺点:缺点:效率低效率低,程序的,程序的可重用性差可重用性差。面向对象的思想面向对象程序设计(C+描述)成信院 李代伟面向对象的方法面向对象的方法l目的:目的:实现软件设计的产业化。实现软件设计的产业化。l
3、观点:观点:自然界是由实体(对象)所组成自然界是由实体(对象)所组成。l程序设计方法:程序设计方法:使用面向对象的观点来描述模仿并处理使用面向对象的观点来描述模仿并处理现实问题。现实问题。l要求:要求:高度概括、分类和抽象高度概括、分类和抽象。面向对象的思想面向对象程序设计(C+描述)成信院 李代伟抽抽 象象抽象是对具体对象(问题)进行概括,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述抽出这一类对象的公共性质并加以描述的过程。的过程。l先注意问题的本质及描述,其次是实现先注意问题的本质及描述,其次是实现过程或细节。过程或细节。l数据抽象:描述某类对象的属性或状态数据抽象
4、:描述某类对象的属性或状态(对象相互区别的物理量)。(对象相互区别的物理量)。l代码抽象:描述某类对象的共有的行为代码抽象:描述某类对象的共有的行为特征或具有的功能。特征或具有的功能。l抽象的实现:通过类的声明抽象的实现:通过类的声明。OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟抽象实例抽象实例钟表钟表l数据抽象:数据抽象:int Hour, int Minute, int Secondl代码抽象:代码抽象:SetTime(), ShowTime(),OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟抽象实例抽象实例钟表类钟表类class Clockpublic: voi
5、d SetTime(int NewH, int NewM, int NewS); void ShowTime();private: int Hour, Minute, Second;OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟抽象实例抽象实例人人l 数据抽象:数据抽象:char *name, char *gender, int age, int idl 代码抽象:代码抽象:生物属性角度:生物属性角度:GetCloth(), Eat(), Step(), 社会属性角度:社会属性角度:Work(), Promote() , OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟封
6、封 装装 将抽象出的数据成员、代码成员相结将抽象出的数据成员、代码成员相结合,将它们视为一个整体。合,将它们视为一个整体。l目的是曾强安全性和简化编程,使用者目的是曾强安全性和简化编程,使用者不不必了解具体的实现细节必了解具体的实现细节,而只需要通过,而只需要通过外外部接口部接口,以特定的访问权限,来使用类的,以特定的访问权限,来使用类的成员。成员。l实现封装:类声明中的实现封装:类声明中的 OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟封封 装装l实例:实例:class Clockpublic: void SetTime(int NewH, int NewM, int NewS)
7、; void ShowTime();private: int Hour, Minute, Second; ;边界边界OOP的基本特点外部接口外部接口特定的访问权限特定的访问权限面向对象程序设计(C+描述)成信院 李代伟继承与派生继承与派生是是C+中支持层次分类的一种机制,中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,允许程序员在保持原有类特性的基础上,进行更具体的说明。进行更具体的说明。实现:声明派生类实现:声明派生类第八章第八章OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟多态性多态性l多态:多态:同一名称,不同的功能实现方式同一名称,不同的功能实现方式。l目的:
8、达到行为标识统一,减少程序中标目的:达到行为标识统一,减少程序中标识符的个数。识符的个数。l实现:实现:重载函数重载函数和和虚函数虚函数第八章第八章OOP的基本特点面向对象程序设计(C+描述)成信院 李代伟c+中的类中的类l类是具有相同属性和行为的一组对象类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括供了统一的抽象描述,其内部包括属属性性和和行为行为两个主要部分。两个主要部分。l利用类可以实现数据的封装、隐藏、利用类可以实现数据的封装、隐藏、继承与派生。继承与派生。l利用类易于编写大型复杂程序,其利用类易于编写大型
9、复杂程序,其模模块化程度比块化程度比C中采用函数更高中采用函数更高。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟类的声明形式类的声明形式l类是一种用户自定义类型,声明形式:类是一种用户自定义类型,声明形式:class 类名称类名称public: / 公有成员(外部接口)公有成员(外部接口)private: / 私有成员私有成员protected: / 保护型成员保护型成员类 和 对 象面向对象程序设计(C+描述)成信院 李代伟公有类型成员公有类型成员在关键字在关键字public后面声明,它们是类与后面声明,它们是类与外部的接口,任何外部函数都可以访问公外部的接口,任何外部函数都可以
10、访问公有类型数据和函数。有类型数据和函数。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟私有类型成员私有类型成员在关键字在关键字private后面声明,后面声明,只允许本只允许本类中的函数访问,而类外部的任何函数类中的函数访问,而类外部的任何函数都不能访问。都不能访问。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟保护类型保护类型与与private类似,在关键字类似,在关键字protected后面声后面声明,明,只允许本类中的函数访问,而类
11、外部的任只允许本类中的函数访问,而类外部的任何函数一般都不能访问何函数一般都不能访问 ,其差别表现在继承与,其差别表现在继承与派生时对派生类的影响不同,对于其派生类来派生时对派生类的影响不同,对于其派生类来说,它与说,它与 public 成员的性质相同,第八章讲。成员的性质相同,第八章讲。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟类的成员类的成员class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second;类 和
12、对 象成员数据成员数据成员函数成员函数面向对象程序设计(C+描述)成信院 李代伟void Clock : SetTime(int NewH, int NewM, int NewS) Hour = NewH; Minute = NewM; Second = NewS;void Clock : ShowTime( ) cout Hour :“ Minute :“ Second;19面向对象程序设计(C+描述)成信院 李代伟成员数据成员数据l与一般的变量声明相同,但需要将与一般的变量声明相同,但需要将它放在类的声明体中。它放在类的声明体中。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟成员
13、函数成员函数l在类中说明原形,在类中说明原形,可以在类外给出函数可以在类外给出函数体实现,并在函数名前使用类名加以限体实现,并在函数名前使用类名加以限定定。也可以直接在类中给出函数体,形。也可以直接在类中给出函数体,形成成内联成员函数内联成员函数。l允许声明重载函数和带默认形参值的函允许声明重载函数和带默认形参值的函数数类 和 对 象面向对象程序设计(C+描述)成信院 李代伟内联成员函数内联成员函数l为了提高运行时的效率,对于较简单为了提高运行时的效率,对于较简单的函数可以声明为内联形式。的函数可以声明为内联形式。l内联函数体中不要有复杂结构(如循内联函数体中不要有复杂结构(如循环语句和环语句
14、和switch语句)。语句)。l在类中声明内联成员函数的方式:在类中声明内联成员函数的方式:l将函数体放在类的声明中。将函数体放在类的声明中。l使用使用inline关键字。关键字。类 和 对 象面向对象程序设计(C+描述)成信院 李代伟内联成员函数举例内联成员函数举例(一一)class Point public: void Init(int initX, int initY) X = initX; Y = initY; int GetX() return X; int GetY() return Y; private: int X, Y;类 和 对 象面向对象程序设计(C+描述)成信院 李代伟
15、内联成员函数举例内联成员函数举例(二二)class Point public: void Init(int initX, int initY); int GetX(); int GetY(); private: int X, Y;类 和 对 象面向对象程序设计(C+描述)成信院 李代伟inline void Point:Init(int initX, int initY) X = initX; Y = initY;inline int Point:GetX() return X;inline int Point:GetY() return Y;25面向对象程序设计(C+描述)成信院 李代伟对对
16、 象象l类的对象是该类的某一特定实体,即类的对象是该类的某一特定实体,即类类型的变量。类类型的变量。l声明形式:声明形式: 类名类名 对象名;对象名;l例:例: Clock myClock;类 和 对 象面向对象程序设计(C+描述)成信院 李代伟类中成员的访问方式类中成员的访问方式l类中成员互访类中成员互访l直接使用成员名直接使用成员名l类外访问类外访问l使用使用“对象名对象名.成员名成员名”方式访问方式访问 public 属性的成员属性的成员类 和 对 象面向对象程序设计(C+描述)成信院 李代伟例例1.1 类的应用举例类的应用举例#includeusing namespace std;cl
17、ass Clock . /类的声明略类的声明略/类的实现略类的实现略int main() Clock myClock; myClock.SetTime(8, 30, 30); myClock.ShowTime();类 和 对 象面向对象程序设计(C+描述)成信院 李代伟构造函数构造函数l构造函数的作用是在对象被创建时使构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象用特定的值构造对象,或者说将对象初始化初始化为一个特定的状态。为一个特定的状态。l在对象创建时在对象创建时由系统自动调用由系统自动调用。l如果程序中未声明,则系统自动产生如果程序中未声明,则系统自动产生出一个出一个默
18、认形式默认形式的构造函数的构造函数l允许为允许为内联函数、重载函数、带默认内联函数、重载函数、带默认形参值的函数形参值的函数构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟构造函数举例构造函数举例class Clockpublic:Clock (int NewH, int NewM, int NewS); /构造函数构造函数void SetTime(int NewH, int NewM, int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟构造函数的实现:构造函
19、数的实现:Clock:Clock(int NewH, int NewM, int NewS)Hour = NewH;Minute = NewM;Second = NewS;建立对象时构造函数的作用:建立对象时构造函数的作用:int main() Clock c (0, 0, 0); / 隐含调用构造函数,将初始值作为实参隐含调用构造函数,将初始值作为实参 c.ShowTime();31面向对象程序设计(C+描述)成信院 李代伟拷贝构造函数拷贝构造函数l拷贝构造函数是一种特殊的构造函数,其形参为本类的拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。对象引用。class 类名类名publ
20、ic : 类名(形参);类名(形参);/构造函数构造函数 类名(类名类名(类名 &对象名);对象名);/拷贝构造函数拷贝构造函数 .;类名类名: 类名(类名类名(类名 &对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数体函数体 构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟例例1.2 拷贝构造函数举例拷贝构造函数举例class Pointpublic: Point( int xx = 0, int yy = 0 ) X = xx; Y = yy; Point(Point& p); int GetX() return X; int GetY() return Y; pr
21、ivate: int X, Y;构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟Point:Point (Point& p) X = p.X; Y = p.Y; cout 拷贝构造函数被调用拷贝构造函数被调用“ endl;34面向对象程序设计(C+描述)成信院 李代伟例例1.2 拷贝构造函数举例拷贝构造函数举例l当用类的一个对象去初始化该类的另一当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实个对象时系统自动调用拷贝构造函数实现拷贝赋值。现拷贝赋值。int main() Point A(1, 2); Point B(A); /拷贝构造函数被调用拷贝构造函数被调用
22、 cout B.GetX() endl;构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟例例1.2 拷贝构造函数举例拷贝构造函数举例l若函数的形参为类对象,调用函数时,实若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函参赋值给形参,系统自动调用拷贝构造函数。例如:数。例如:void fun1(Point p) cout p.GetX() endl; int main() Point A(1, 2); fun1(A); /调用拷贝构造函数调用拷贝构造函数 构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟l当函数的返回值是类对象时,系统自动调用当函数
23、的返回值是类对象时,系统自动调用拷贝构造函数。例如:拷贝构造函数。例如:Point fun2() Point A(1, 2); return A; /调用拷贝构造函数调用拷贝构造函数int main() Point B; B = fun2(); 构造函数和析构函数例例1.2 拷贝构造函数举例拷贝构造函数举例面向对象程序设计(C+描述)成信院 李代伟拷贝构造函数拷贝构造函数l如果程序员没有为类声明拷贝初始化如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构构造函数,则编译器自己生成一个拷贝构造函数(造函数(默认拷贝构造函数默认拷贝构造函数)。)。l这个构造函数执行的功能是:用作
24、为这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。化将要建立的对象的对应数据成员。构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟析构函数析构函数l完成对象被删除前的一些完成对象被删除前的一些清理清理工作。工作。l在对象的生存期结束的时刻系统自动调在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。用它,然后再释放此对象所属的空间。l如果程序中未声明析构函数,编译器将如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。自动产生一个默认的析构函数。构造函数和析构函数面向对
25、象程序设计(C+描述)成信院 李代伟构造函数和析构函数举例构造函数和析构函数举例#include using namespace std;class Point public: Point(int xx, int yy); Point(); /.其它函数原形其它函数原形private: int X, Y;构造函数和析构函数面向对象程序设计(C+描述)成信院 李代伟Point:Point(int xx, int yy) X = xx; Y = yy;Point:Point()/.其它函数的实现略其它函数的实现略41面向对象程序设计(C+描述)成信院 李代伟例例1.3 类的应用举例类的应用举例l一
26、圆型游泳池如图所示,现在需在其周围一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格建一圆型过道,并在其四周围上栅栏。栅栏价格为为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽度平方米。过道宽度为为3米,游泳池半径由键盘输入。要求编程计算米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。并输出过道和栅栏的造价。游泳池过道面向对象程序设计(C+描述)成信院 李代伟#include using namespace std;const float PI = 3.14159;const float FencePrice = 35;const fl
27、oat ConcretePrice = 20;/声明类声明类Circle 及其数据和方法及其数据和方法class Circleprivate: float radius; public: Circle(float r); /构造函数构造函数 float Circumference() const;/圆周长圆周长 float Area() const; /圆面积圆面积;43面向对象程序设计(C+描述)成信院 李代伟/ 类的实现类的实现/ 构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r) radius = r;/ 计算圆的周长计算圆的周长floa
28、t Circle:Circumference() const return 2 * PI * radius; / 计算圆的面积计算圆的面积 float Circle:Area() const return PI * radius * radius;44面向对象程序设计(C+描述)成信院 李代伟int main () float radius; float FenceCost, ConcreteCost; / 提示用户输入半径提示用户输入半径 cout radius; / 声明声明 Circle 对象对象 Circle Pool( radius ); Circle PoolRim( radius
29、 + 3 ); 45面向对象程序设计(C+描述)成信院 李代伟 / 计算栅栏造价并输出计算栅栏造价并输出 FenceCost = PoolRim.Circumference() * FencePrice; cout Fencing Cost is ¥ FenceCost endl; / 计算过道造价并输出计算过道造价并输出 ConcreteCost = (PoolRim.Area() - Pool.Area() * ConcretePrice; cout Concrete Cost is ¥ ConcreteCost yabbaDabbaDo(); / 错误:错误:Fred类的对象在类的对象在
30、 / 定义前被使用定义前被使用 private: Fred* x; / 正确,经过前向引用声明,正确,经过前向引用声明, / 可以声明可以声明Fred类的对象指针类的对象指针; class Fred public: void yabbaDabbaDo();private: Barney* y; ; 类 的 组 合面向对象程序设计(C+描述)成信院 李代伟前向引用声明注意事项前向引用声明注意事项l应该记住:当你使用前向引用声明时,应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉你只能使用被声明的符号,而不能涉及类的任何细节。及类的任何细节。类 的 组 合面向对象程序设计(C+描
31、述)成信院 李代伟UML简介简介lUML语言是一种可视化的的面向对象建模语言是一种可视化的的面向对象建模语言。语言。lUML有三个基本的部分有三个基本的部分事物(事物(Things)UML中重要的组成部分,在模型中属于最静态中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素的部分,代表概念上的或物理上的元素关系(关系(Relationships)关系把事物紧密联系在一起关系把事物紧密联系在一起图(图(Diagrams)图是很多有相互相关的事物的组图是很多有相互相关的事物的组UML图形标识面向对象程序设计(C+描述)成信院 李代伟UML中有中有4种类型的事物种类型的事物l结构
32、事物(结构事物(Structural things)l动作事物(动作事物(Behavioral things)l分组事物(分组事物(Grouping things)l注释事物(注释事物(Annotational things)UML图形标识面向对象程序设计(C+描述)成信院 李代伟UML中的关系中的关系l依赖(依赖(Dependencies) l关联(关联(Association) l泛化(泛化(generalization) l实现(实现(realuzation)UML图形标识面向对象程序设计(C+描述)成信院 李代伟UML中的中的9种图种图l类图(类图(class diagram)l对象图
33、(对象图(class diagram)l用例图(用例图(Use case diagram)l顺序图(顺序图(Sequence diagram)l协作图(协作图(Collaboration diagram)l状态图(状态图(Statechart diagram)l活动图(活动图(Activity diagram)l组件图(组件图(Compomnent diagram)l实施图(实施图(Deployment diagram)UML图形标识面向对象程序设计(C+描述)成信院 李代伟类类 图图l举例:举例:Clock类的完整表示类的完整表示lClock类的简洁表示类的简洁表示Clock- Hour :
34、 int- Minute : int- Second : int+ ShowTime() : void+ SetTime(NewH : int = 0, NewM : int = 0, NewS : int = 0) : voidClockUML图形标识面向对象程序设计(C+描述)成信院 李代伟对象图对象图myClock : Clock- Hour : int- Minute : int- Second : intmyClock : ClockUML图形标识面向对象程序设计(C+描述)成信院 李代伟类与对象关系的图形标识类与对象关系的图形标识l依赖关系依赖关系图中的图中的“类类A”是源,是源,
35、“类类B”是目标,表是目标,表示示“类类A”使用了使用了“类类B”,或称,或称“类类A”依赖依赖“类类B”类类 A类类 BUML图形标识面向对象程序设计(C+描述)成信院 李代伟类与对象关系的图形标识类与对象关系的图形标识l作用关系作用关系关联关联图中的图中的“重数重数A”决定了类决定了类B的每个对象与的每个对象与类类A的多少个对象发生作用,同样的多少个对象发生作用,同样“重数重数B”决定了类决定了类A的每个对象与类的每个对象与类B的多少个的多少个对象发生作用。对象发生作用。类类 A重数重数A类类 B重数重数BUML图形标识面向对象程序设计(C+描述)成信院 李代伟类与对象关系的图形标识类与对
36、象关系的图形标识l包含关系包含关系聚集和组合聚集和组合类类 A类类 B重数重数A重数重数B类类 A类类 B重数重数A重数重数B聚集表示类之间的关系是整体与部分的关系,聚集表示类之间的关系是整体与部分的关系,“包包含含”、“组成组成”、“分为分为部分部分”等都是聚集关系。等都是聚集关系。UML图形标识面向对象程序设计(C+描述)成信院 李代伟类与对象关系的图形标识类与对象关系的图形标识l继承关系继承关系泛化泛化父类父类 A父类父类 B子类子类 1子类子类 2UML图形标识面向对象程序设计(C+描述)成信院 李代伟注注 释释l在在UML图形上,注释表示为带有褶角图形上,注释表示为带有褶角的矩形,然
37、后用虚线连接到的矩形,然后用虚线连接到UML的其的其他元素上,它是一种用于在图中附加他元素上,它是一种用于在图中附加文字注释的机制。文字注释的机制。注释文字注释文字UML图形标识面向对象程序设计(C+描述)成信院 李代伟第二节 C+程序的结构面向对象程序设计(C+描述)成信院 李代伟本节主要内容本节主要内容l作用域与可见性作用域与可见性l对象的生存期对象的生存期l数据与函数数据与函数lthis指针指针l静态成员静态成员l共享数据的保护共享数据的保护l友元友元l编译预处理命令编译预处理命令l多文件结构和工程多文件结构和工程面向对象程序设计(C+描述)成信院 李代伟函数原型的作用域函数原型的作用域
38、l函数原型中的参数,其作用域函数原型中的参数,其作用域开始于开始于(,结束于,结束于)。l例如,设有下列原型声明:例如,设有下列原型声明:double Area(double radius);radius 的作用域仅在于此,不的作用域仅在于此,不能用于程序正文其它地方,因能用于程序正文其它地方,因而可有可无。而可有可无。作用域与可见性面向对象程序设计(C+描述)成信院 李代伟块作用域块作用域l块是一对花括号块是一对花括号“ ”括起来的一段程序单元。括起来的一段程序单元。l在块中声明的标识符,其作用域自声明处起,在块中声明的标识符,其作用域自声明处起,结束于块的右花括号。例如:结束于块的右花括号
39、。例如:void fun(int a) int b(a); cin b; if(b 0) int c; . c的作用域的作用域b的作用域的作用域作用域与可见性面向对象程序设计(C+描述)成信院 李代伟类作用域类作用域l类作用域作用于特定的成员名。类作用域作用于特定的成员名。l类类CX的成员的成员M具有类作用域具有类作用域,对对M的访问方的访问方式如下:式如下: 如果在如果在X的成员函数中没有声明同名的局部作用域的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员标识符,那么在该函数内可以访问成员M。通过表达式通过表达式 x.M 或者或者 CX:M 访问。访问。通过表达式通过表
40、达式 ptr-M作用域与可见性面向对象程序设计(C+描述)成信院 李代伟文件作用域文件作用域l不在前述各个作用域中出现的声明,不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于符的作用域开始于声明点,结束于文件尾。文件尾。作用域与可见性面向对象程序设计(C+描述)成信院 李代伟可见性可见性l可见性是从对标识符的可见性是从对标识符的引用的角度引用的角度来谈的概念来谈的概念l可见性表示可见性表示从内层作用域向外层作用域从内层作用域向外层作用域“看看”时能看见什么时能看见什么。l如果标识在某处可见,则就可以在该处引用此如果标识在
41、某处可见,则就可以在该处引用此标识符。标识符。 块作用域块作用域 类作用域类作用域 文件作用域文件作用域作用域与可见性面向对象程序设计(C+描述)成信院 李代伟可见性可见性l标识符应标识符应声明在先,引用在后声明在先,引用在后。l如果某个标识符在外层中声明,且在内层中如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层没有同一标识符的声明,则该标识符在内层可见。可见。l对于两个嵌套的作用域,如果在内层作用域对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。(外层作用域的标识符
42、在内层不可见。(屏蔽屏蔽或隐藏或隐藏)作用域与可见性面向对象程序设计(C+描述)成信院 李代伟同一作用域中的同名标识符同一作用域中的同名标识符l在同一作用域内的对象名、函数名、在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚枚举常量名会隐藏同名的类名或枚举类型名。举类型名。l重载的函数可以有相同的函数名。重载的函数可以有相同的函数名。(但必须有不同的形参表:个数或(但必须有不同的形参表:个数或顺序)顺序)作用域与可见性面向对象程序设计(C+描述)成信院 李代伟#includeusing namespace std;int i; /文件作用域文件作用域int main( ) i =
43、 5; int i; / 块作用域块作用域 i = 7; cout i = i endl; / 输出输出7 cout i = i; / 输出输出5作用域与可见性例例 2.1面向对象程序设计(C+描述)成信院 李代伟对象的生存期对象的生存期l对象从产生到结束的这段时间就是它的生存期。对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新在对象生存期内,对象将保持它的值,直到被更新为止为止。l离开了作用域的对象有可能仍然生存着。离开了作用域的对象有可能仍然生存着。l暂时不可见的对象,也可能仍然生存着。暂时不可见的对象,也可能仍然生存着。面向对象程序设计(C+描述)成
44、信院 李代伟静态生存期静态生存期l这种生存期这种生存期与程序的运行期相同与程序的运行期相同。l在文件作用域中声明的对象具有这种生在文件作用域中声明的对象具有这种生存期。存期。l在函数内部声明静态生存期对象,要冠在函数内部声明静态生存期对象,要冠以关键字以关键字static 。对象的生存期面向对象程序设计(C+描述)成信院 李代伟#includeusing namespace std;int a = 5; / 文件作用域中声明对象文件作用域中声明对象int main( ) cout a = a endl; static b = 2; / 函数内部声明静态生存期对象函数内部声明静态生存期对象 co
45、ut b = b endl;a具有静态生存期具有静态生存期b具有静态生存期具有静态生存期对象的生存期例例2.2面向对象程序设计(C+描述)成信院 李代伟动态生存期动态生存期l块作用域中声明的,没有用块作用域中声明的,没有用static修修是的对象是动态生存期的对象(习惯是的对象是动态生存期的对象(习惯称局部生存期对象)。称局部生存期对象)。l开始于程序执行到声明点时,结束于开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。命名该标识符的作用域结束处。对象的生存期面向对象程序设计(C+描述)成信院 李代伟#includeusing namespace std;void fun();in
46、t main() fun(); fun();void fun() static int a =1; int b = 5; a+; b+; cout b = b , a = a endl;运行结果:运行结果:b = 6, a = 2b = 6, a = 3b是动态生存期是动态生存期a是静态生存期是静态生存期对象的生存期例例2.3面向对象程序设计(C+描述)成信院 李代伟例例2.4 变量的生存期与可见性变量的生存期与可见性(上机验证)(上机验证)#includeusing namespace std;int i = 1; / i 为全局变量,具有静态生存期为全局变量,具有静态生存期int main
47、( ) static int a; / 静态局部变量,有全局寿命,局部可见静态局部变量,有全局寿命,局部可见 int b = 10, c = 0; / b, c为局部变量,具有动态生存期为局部变量,具有动态生存期 void other(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( ); 对象的生存期面向对象程序设计(C+描述)成信院 李代伟void other(void
48、) static int a = 2; static int b; / a,b为静态局部变量,具有全局寿命,局部可见为静态局部变量,具有全局寿命,局部可见 /只第一次进入函数时被初始化只第一次进入函数时被初始化 int c = 10; / C为局部变量,具有动态生存期,为局部变量,具有动态生存期, / 每次进入函数时都初始化每次进入函数时都初始化 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面向对象程序设计(C+描述)成信院 李代伟运行结果:运行结果:-MA
49、IN- 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 : 1518面向对象程序设计(C+描述)成信院 李代伟例例2.5 具有静态、动态生存期对象的时钟程序具有静态、动态生存期对象的时钟程序(上机验证)(上机验证)#includeusing namespace std;class Clock / 时钟类声明时钟类声明public: / 外部接口外部接口Clock();void SetTime(int Ne
50、wH, int NewM, int NewS); / 三个形参均具有函数原型作用域三个形参均具有函数原型作用域void ShowTime( );Clock( ) private: / 私有数据成员私有数据成员int Hour, Minute, Second;对象的生存期面向对象程序设计(C+描述)成信院 李代伟/ 时钟类成员函数实现时钟类成员函数实现Clock:Clock( ) / 构造函数构造函数Hour = 0;Minute = 0;Second = 0;void Clock:SetTime( int NewH, int NewM, int NewS ) Hour = NewH;Minut
51、e = NewM;Second = NewS;void Clock:ShowTime( ) cout Hour : Minute : Second endl;20面向对象程序设计(C+描述)成信院 李代伟Clock globClock;/ 声明声明对象对象globClock, / 具有静态生存期,文件作用域具有静态生存期,文件作用域int main( )/ 主函数主函数cout First time output: endl;/ 引用具有文件作用域的对象:引用具有文件作用域的对象:globClock.ShowTime( ); / 对象的成员函数具有类作用域对象的成员函数具有类作用域globCl
52、ock.SetTime(8, 30, 30);Clock myClock( globClock ); / 声明具有块作用域的对象声明具有块作用域的对象myClockcout Second time output: endl;myClock.ShowTime( ); / 引用具有块作用域的对象引用具有块作用域的对象21面向对象程序设计(C+描述)成信院 李代伟程序的运行结果为:程序的运行结果为:First time output:0:0:0Second time output:8:30:3022面向对象程序设计(C+描述)成信院 李代伟数据与函数数据与函数l数据存储在局部对象中,通过参数传递实数
53、据存储在局部对象中,通过参数传递实现共享现共享函数间的参数传递函数间的参数传递。(。(开销大开销大)l数据存储在数据存储在全局对象全局对象中。(开销小,但中。(开销小,但模模块间相互影响且数据不安全块间相互影响且数据不安全)l将数据和使用数据的函数将数据和使用数据的函数封装在类中封装在类中。(既实现数据共享,又兼顾安全性既实现数据共享,又兼顾安全性)数据与函数面向对象程序设计(C+描述)成信院 李代伟使用全局对象使用全局对象#includeusing namespace std;int global = 0;void f( ) global = 5;void g( ) cout global
54、endl;int main( ) f( ); g( ); / 输出输出“5” return 0;数据与函数面向对象程序设计(C+描述)成信院 李代伟将函数与数据封装将函数与数据封装#includeusing namespace std;class Applicationpublic: void f( ); void g( );private: int global;void Application:f( ) global = 5;void Application:g( ) cout global X = xx;thisY = yy;this指针面向对象程序设计(C+描述)成信院 李代伟this
55、指针指针l解引用解引用this指针来复制调用对象指针来复制调用对象this指针总是指向非静态成员函数的调用指针总是指向非静态成员函数的调用实例,这意味着表达式实例,这意味着表达式*this就能获得调用就能获得调用对象本身对象本身。可以通过把。可以通过把*this传递给拷贝构传递给拷贝构造函数来获取当前调用对象的一个副本而造函数来获取当前调用对象的一个副本而不会影响原有的实例。不会影响原有的实例。this指针面向对象程序设计(C+描述)成信院 李代伟this指针指针l解引用解引用this指针以允许链接函数指针以允许链接函数成员函数的调用可以链接在一起,这意味着在一条语句中成员函数的调用可以链接在
56、一起,这意味着在一条语句中可以同时将更多的消息发生给类的实例。一般来讲,它的可以同时将更多的消息发生给类的实例。一般来讲,它的形式如下:形式如下: instanceName.firstMessage().secondMessage(); 为了编写这样的代码,成员函数必须返回值为了编写这样的代码,成员函数必须返回值*this,函数的,函数的返回类型应该就是引用的类类型本身返回类型应该就是引用的类类型本身。如果一个成员函数返回如果一个成员函数返回*this,那么可以把一个成员函数和,那么可以把一个成员函数和另一个成员函数链接到一起,并且通过引用将其类名指定另一个成员函数链接到一起,并且通过引用将其
57、类名指定为返回类型为返回类型。例如:例如:输出流对象输出流对象cout把一系列的输出操作链接在一起把一系列的输出操作链接在一起输入流对象输入流对象cin把一系列的输入操作链接在一起把一系列的输入操作链接在一起this指针面向对象程序设计(C+描述)成信院 李代伟静态成员静态成员l静态数据成员静态数据成员用关键字用关键字static声明声明该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化必须在类外定义和初始化,用用(:)来指明所来指明所属的类属的类。l静态成员函数静态成员函数类外代码可以使用类名和作用域操作符来类外代码可以使用类名和作用域操作符来调用
58、静态成员函数。调用静态成员函数。静态成员函数静态成员函数只能引用属于该类的静态数只能引用属于该类的静态数据成员或静态成员函数据成员或静态成员函数。静态成员面向对象程序设计(C+描述)成信院 李代伟例例2.6 具有静态数据成员的具有静态数据成员的 Point类类#include using namespace std;class Point public:Point( int xx = 0, int yy = 0) X = xx; Y = yy; countP+; Point(Point &p);int GetX( ) return X; int GetY( ) return Y; void G
59、etC( ) cout Object id = countP endl; private:int X, Y;static int countP; / 在类内部声明在类内部声明;静态成员面向对象程序设计(C+描述)成信院 李代伟Point:Point(Point &p) X = p.X;Y = p.Y;countP+;int Point:countP = 0; / 在类外部定义和初始化在类外部定义和初始化int main( ) Point A(4, 5); cout Point A, A.GetX( ) , A.GetY( );A.GetC( );Point B( A );cout Point
60、B, B.GetX( ) , B.GetY( );B.GetC( );28面向对象程序设计(C+描述)成信院 李代伟静态成员函数举例静态成员函数举例#includeusing namespace std;class Application public: static void f(); static void g();private: static int global; int a;int Application:global = 0;void Application:f( ) /只能访问静态数据成员只能访问静态数据成员 global = 5;void Application:g( ) /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学二年级第二学期课堂教学改革计划
- 神经病人护理流程
- 河南8年级上册数学试卷
- 承包ktv协议书范本
- 诚信合作协议书范本
- 幼儿园疫情期间安全保障计划
- 云南曲靖经济技术开发区教育系统选调事业人员笔试真题2024
- 通信基站建设保障措施
- 陈列协议书范本简易
- 贵阳名校联考数学试卷
- WB/T 1092-2018钢铁物流包装、标识规范
- SC/T 3503-2000多烯鱼油制品
- GB/T 18109-2011冻鱼
- 清真食堂承包投标书
- 《数据科学与大数据技术导论》完整版课件(全)
- 马克思主义的世界观和方法论
- 医院处方笺-模板
- 道路综合巡查工作流程
- 模具试模通知单
- 香港联合交易所有限公司证券上市规则
- 泵站电气设备安装调试施工方案
评论
0/150
提交评论