Presentation is loading. Please wait.

Presentation is loading. Please wait.

4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板

Similar presentations


Presentation on theme: "4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板"— Presentation transcript:

1 4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
第4章 类与对象 4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板

2 4.1 概述 结构化程序设计方法的基本思想是:自顶向下,逐步求精;按功能划分为若干个模块,模块本身还可以再做适当分解,形成树状结构;模块是单入口和单出口的,内部都是由顺序、选择和循环三种基本控制结构组成。

3 面向过程的程序的缺点 可重用性和可扩充性较差,维护代价高,数据的安全性也往往得不到有效的控制。程序开发的效率难以提高,程序的规模受到限制,严重影响了软件产业的发展。

4 银行业务处理系统 1 typedef struct ACC { long acc_id; /*帐号*/
char name[30]; /*客户姓名*/ float bal_mon; /*帐户余额*/ float int_year; /*年利息*/ int acc_type; /*帐户类型(现金、支票或贷款)*/ }account;

5 问题 结构化程序设计方法是围绕实现处理功能的过程来构造系统的,然而用户需求的变化基本上是针对功能的。用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价,才能适应并实现这种变化。

6 假设根据业务发展的情况,需要增加公积金帐户,重新编写代码,修改对操作的处理过程,显然这会大大增加软件维护的代价。
如果银行开通网上银行业务,在编写操作过程的同时,由于要增加网络数据的处理,客户的银行帐户等相应的数据结构也必须随之调整,这又可能会对整个系统的操作带来新的影响。 由于对bal_mon数据项未做访问上的特别限制,使得帐户余额容易从外部被修改。

7 面向对象程序设计 面向对象程序设计的出发点和基本原则,是使开发软件的方法与过程尽可能接近人们认识世界解决问题的模式,也就是使描述问题的问题空间与解决问题的解空间,在结构上尽可能保持一致。 面向对象程序设计方法是一种以对象为核心,以数据为主线,把数据和处理相结合的方法。对象是由数据和允许施加在数据上的操作所构成的统一体,自身就是进行处理的主体。

8 面向对象程序设计方法对一些对象的共性加以抽象,形成类,每一个对象都属于一个特定的类。类定义了一组数据和一组方法,数据表达对象的状态信息,用于表示对象的静态属性;类中定义的方法,是允许施加于该类对象的操作,为该类对象所共享。

9 可以用一些简单类的对象构造出复杂的类,或者在原有类的基础上,派生出一个新的类。派生的类除了具有原有类的属性和行为之外,还可以添加新的属性和行为;
对原有类的某些行为,也可以重新进行描述,有自己独特的表现形式,即多态性。

10 银行业务处理系统 2 class account { public: void acc_dep(float m); //存款
float acc_wit(float m); //取款 bool acc_tra(account &p, float m); //转帐 private: long acc_id; //帐号 char name[30]; //客户姓名 float bal_mon; //帐户余额 float int_year; //年利息 };

11 面向对象=对象+类+消息+继承+多态性 1.对象 对象是构成系统的基本单位。对象由属性和行为组成,属性表示对象的性质,用来描述对象静态特征的数据项,属性值则规定了对象所有可能的状态,对象的行为是用来描述对象动态特征的操作序列。

12 2.类 类是具有相同的属性和行为的一组对象的集合,是建立对象时使用的模板,对象就是类的实例。 3.消息 对象之间的这种联系和作用是通过消息来完成的。消息就是要求某个对象执行某种操作的规格说明,通常由以下3个部分组成:接收消息的对象名、消息名和消息参数。

13 4.继承 类之间的继承关系是对现实世界中遗传关系的模拟,表示类之间的内在联系以及对属性和行为的共享,即派生类可以自动沿用基类的某些特征。 5.多态性 多态性是指在基类中定义的行为,被派生类继承之后,可以具有不同的表现形式。在面向对象程序设计方法中,类的多态性主要表现在,不同类的对象接收到同样的消息后,产生不同的行为方式。

14 4.2 类与对象的实现 class 类名 { public: 公有成员列表; protected: 保护成员列表; private:
私有成员列表; };

15 class和类名构成类的头部。class是关键字,用来定义类,类名一般不能省略。
{}包含类的主体,在其中定义类的成员。这些成员既可以是数据成员,描述类的属性(attribute);也可以是成员函数,描述类的方法(method)。 public、protected和private是关键字,后跟冒号(:),用于说明其下成员列表的访问控制属性。 }后的分号(;)表示类的定义结束,不可省略。

16 时钟类 class clock { public: void ShowTime(void);//显示时间
void SetTime(int h,int m,int s);//设置时间 private: int hour;//小时 int minute;//分钟 int second;//秒 };

17 数据成员 类型 数据成员名; C++语言不允许在类的主体中定义数据成员时,同时进行初始化。例如以下类的定义是非法的: class clock
{ …… private: int hour=0; //错误 };

18 成员函数 1.直接将函数定义在类的主体中。 class clock { …… public:
void ShowTime(void)//显示时间 cout<<hour<<”:”<<minute<<”:”<<second<<endl; } };

19 2.在类的主体中给出函数原型(function prototype),然后在类的外部定义成员函数。
类型 类名::成员函数名(参数表) { } 作用域运算符(::)指出该成员函数所属的类。

20 class clock { public: void ShowTime(void);//显示时间 …… }; void clock::ShowTime(void) cout<<hour<<”:”<<minute<<”:”<<second<<endl; }

21 访问控制属性 访问控制属性有公有类型(public)、私有类型(private)和保护类型(protected)。
公有类型的成员,其访问权限不受限制,既可以被类的其它成员访问,也可以被外部的对象或者函数访问。私有类型的成员只允许被类的其它成员访问,而不允许来自外部的访问。保护类型与私有类型相似,两者之间的差别主要体现在类的继承中。

22 对象 类名 对象名; 例如: clock s1,s2; 发送消息的语法形式是: 对象名.公有成员函数名(实参表);

23 4.3 对象的初始化和析构 C++语言提供了类的两个成员函数,它们分别是构造函数和析构函数,可以帮助用户自动完成对象的初始化和清理性工作。

24 构造函数 构造函数(constructor)是类所特有的成员函数,对象创建时自动被调用,完成对象的初始化工作。其语法形式为:
类名(参数表);

25 案例 class clock //时钟类的定义 { public: //公有成员函数
clock(int h=0, int m=0, int s=0);//构造函数 }; clock::clock(int h, int m, int s) hour=h>=0&&h<24?h:0; minute=m>=0&&m<60?m:0; second=s>=0&&s<60?s:0; } clock s(10,30,30);//创建对象并初始化

26 说明 1.构造函数名与类名相同。 2.构造函数无返回值,不能把void写在构造函数名的前面,函数体中也不能出现return语句。
3.构造函数的访问控制属性必须是public。

27 拷贝构造函数 拷贝构造函数(copy constructor)是构造函数的特例,它的作用是自动用一个已经存在的同类对象,去初始化另一个新的对象。 语法形式为: 类名(类名 &对象名);

28 案例 clock::clock(clock &p) { hour=p.hour; minute=p.minute;
second=p.second; } clock s(10,30,30);//创建对象s,构造函数被调用 clock t(s);//创建对象t,拷贝构造函数被调用

29 拷贝构造函数调用的时机 (1)创建对象时,用一个已存在的对象初始化该类另一个新对象。
(2)函数的形参是对象,函数调用时,发生形实结合,用实参对象复制形参对象。 (3)函数返回值的类型是类,函数调用结束,返回一个对象。

30 析构函数(destructor),这是类的一个特殊的成员函数,在对象消亡前自动被调用,完成清理性工作。
其语法形式为: ~类名();

31 clock::~clock() { cout<<”对象即将消亡”<<endl; } 1.析构函数名是在类名前加~(按位取反符),表示它与构造函数的作用正好相反。 2.析构函数没有返回值,没有参数,也不允许重载,即一个类仅有一个析构函数。

32 4.4 类的包含 类包含了其它类的对象作为自己的数据成员,包含了对象成员的类称为组合类。 class circle { … private:
point p;//对象成员 };

33 组合类的初始化 类名::类名(参数总表):对象成员1(参数表),对象成员2(参数表)… { }

34 说明 初始化时,先按照对象成员在组合类中定义的顺序,依次调用对象成员的构造函数,最后调用组合类的构造函数。
析构函数的调用顺序与构造函数正好相反。

35 4.5 类模板 类模板允许为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数或者返回值,能取任意数据类型。任意数据类型包括基本数据类型,以及用户自定义的构造类型等。

36 语法形式 template <class 类型参数1,class 类型参数2…> class 类名 { };

37 说明 1.类模板中数据成员的类型、成员函数参数的类型以及返回值的类型,可以是模板参数表中的类型参数。
2.定义类模板的成员函数时,也必须加上模板参数表,与函数模板的形式类似。例如: template <class T> T A <T>:: fun1(T x) { }

38 类模板代表着一个类的集合。在使用时给出模板实参表,由类模板生成一个实际的模板类,再创建对象。其语法形式为:
类名 <模板实参表> 对象1,对象2… 例如: A <int> b1,b2… C++将模板实参表中的参数,与类模板定义时模板参数表中的参数一一对应,生成一个模板类,然后创建该类的对象。


Download ppt "4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板"

Similar presentations


Ads by Google