第四章C++类与对象
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
回顾:面向过程的设计方法
面 向 对 象 的 思 想
重点:
如何实现细节过程,将数据与函数分开。
形式:
主模块+若干个子模块(main( )+子函数)。
自顶向下,逐步求精——功能分解。 效率低,程序的可重用性差。
特点:
缺点:
4
面向对象的方法
面 向 对 象 的 思 想
目的:
实现软件设计的产业化。 自然界是由实体(对象)所组成的。OO方法 是采用对自然界的模仿描述并处理现实问题的 方法。 抽象、封装、继承和多态 高度概括、分类、和抽象。
15
对象/类(Object&Class)
类 和 对 象
对象是由数据(数据成员、成员变量、实例变 量、对象的局部变量等)及能对其实施的操作 (成员函数、方法或消息处理过程等)所构成 的封装体,它属于值的范畴。
类(对象的类型)描述了对象的特征(数据和 操作),它属于类型的范畴 。 类是对逻辑上相关的函数和数据的封装,是对 问题的抽象描述。
OOP
的 基 本 特 点
6
抽象实例——钟表
OOP
数据抽象:
int Hour, int Minute, int Second
的 基 本 特 点
功能抽象:
SetTime( ), ShowTime( )
7
抽象实例——钟表类
OOP
class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; };
5
观点:
OO程序设计特点:
要求:
面向对象程序设计的基本特点 ——抽象
抽象是对具体对象(问题)进行概括,抽出 这一类对象的公共性质并加以描述的过程。
先注意问题的本质及描述,其次是实现过程 或细节。 数据抽象:描述某类对象的属性或状态(对 象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征 或具有的功能。 抽象的实现:通过类的声明。
class 类名称 { public: private: 公有成员(外部接口)
};
私有成员 protected: 保护型成员
17
类成员的访问控制
类 和 对 象
在C++的类定义中,可以用访问控制修饰符public, private或protected来描述对类成员的访问限制。 例如:
class A { public: //访问不受限制。 int x; void f(); private: //只能在本类和友元中访问。 int y; void g(); protected: //只能在本类、派生类和友元中访问。 int z; void h(); };
31
程序实例
类 和 对 象
void Clock :: SetTime(int NewH, int NewM,int NewS) { Hour=NewH; Minute=NewM; Second=NewS; } void Clock :: ShowTime() {
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
8
的 基 本 特 点
抽象实例——人
OOP
数据抽象:
char *name,char *sex, int age, int id
的 基 本 特 点
代码抽象:
生物属性角度: GetCloth( ), Eat( ), Step( ),…
社会属性角度: Work( ), Promote( ) ,…
9来自百度文库
面向对象程序设计的基本特点 ——封装
特定的访问权限
的 基 本 特 点
边界:实现封装
11
面向对象程序设计的基本特点 ——继承与派生
OOP
是C++中支持层次分类的一种机制,允许程 序员在保持原有类特性的基础上,进行更具体 的说明。 实现:声明派生类——第七章
的 基 本 特 点
12
面向对象程序设计的基本特点 ——多态性
的 基 本 特 点
16
类的定义
时钟类定义:
class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; };
类 和 对 象
C++的类是一种用户自定义类型,定义形式如下:
{ ...... //允许访问:x,y,f,g,h } protected: int y; void h() { ...... //允许访问:x,y,f,g,h }
};
25
类的成员函数
类 和 对 象
成员函数描述了对类定义中的数据成员 所能实施的操作。 成员函数的实现:
成员函数一般是将函数的原型写在类体中,实现 是写在类定义之外的。 成员函数的定义也可以放在类定义中,此时形成 内联成员函数。例如:
19
类成员的访问控制
类 和 对 象
类的数据成员和在类的内部使用的成员函数应 该指定为private,只有提供给外界使用的成员 函数才指定为public。 public访问控制的成员构成了类与外界的一种 接口(interface)。操作一个对象时,只能通 过访问对象类中的public成员来实现。 protected类成员访问控制具有特殊的作用(继 承)。其差别表现在继承与派生时对派生类的 影响不同,第七章讲。
OOP 的 基 本 特 点
将抽象出的数据成员、代码成员相结合, 将它们视为一个整体,即形成“类”。
目的是增强安全性和简化编程,使用者不
必了解具体的实现细节,而只需要通过外 部接口,以特定的访问权限,来使用类的 成员。
实现封装:类声明中的{}
10
封装实例——钟表类
OOP
实例:
class Clock { 外部接口 public: void SetTime(int NewH,int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; };
29
内联成员函数
类 和 对 象
内联成员函数与一般的内联函数一样,函 数体中不允许有复杂结构(如循环语句和 switch语句)。 内联成员函数的定义方式:
将函数体放在类的声明中。 在类外使用inline关键字定义的成员函数。
30
程序实例
类 和 对 象
#include<iostream> using namespace std; class Clock { public: void SetTime (int NewH=0, int NewM=0,int NewS=0); void ShowTime(); private: int Hour, Minute, Second; };
面向对象程序设计的基本特点 类和对象 构造函数和析构函数 类的组合 UML图形标识 结构体和联合体 程序实例
14
类和对象 —— c++中的类
类 和 对 象
类是具有相同属性和行为的一组对象的集 合,它为属于该类的全部对象提供了统一 的抽象描述,其内部包括属性和行为两个 主要部分。 利用类可以实现数据的封装、隐藏、继承 与派生。 利用类易于编写大型复杂程序,其模块化 程度比C中采用函数更高。
18
类成员的访问控制
类 和 对 象
在类定义中,可以有多个public、private和 protected访问控制说明,C++的默认访问控制 是private,例如:
class A { int m,n; //m,n的访问控制说明为private。 public: int x; void f(); private: int y; void g(); protected: int z; void h(); public: void f1(); };
27
注意: 一般将类的实现放在类外 定义。此时,类的成员函 数名需要限制,例如 Clock::ShowTime
类的成员函数
类 和 对 象
成员函数调用中的目的对象: 调用成员函数需要使用“.”操作符指出调 用所针对的对象,这一对象在本次调用中称为 目的对象。
类中成员互访
直接使用成员名 使用“对象名.成员名”方式访问 public 属性的 成员
C++语言程序设计
第四章 类与对象
主讲:康 丽
1
本章内容
面向对象程序设计的基本特点 类和对象 构造函数和析构函数 类的组合 UML图形标识 结构体和联合体 程序实例
2
本章内容
面向对象程序设计的基本特点 类和对象 构造函数和析构函数 类的组合 UML图形标识 结构体和联合体 程序实例
对象
类 和 对 象
类的对象是该类的某一特定实体, 即类类型的变量。 声明形式: 类名 对象名; 例: Clock myClock;
23
类中成员的访问方式
类 和 对 象
类中成员互访
直接使用成员名
类外访问
使用“对象名.成员名”方式访问 public 属性 的成员
24
通过对象来访问类的成员时要受到类成员访问控 制的限制,例如: ...... class A A a; { public: void f() a.f(); //OK { ...... //允许访问:x,y,f,g,h a.x = 1; //Error } a.g(); //Error private: a.y = 1; //Error int x; void g() a.h(); //Error
20
数据成员
类定义中的数据成员描述了类的对象所包含的数据的类型, 数据成员的说明格式与非成员数据的声明格式相同,例如: class Date //类定义 { ...... private: //访问控制说明 int year,month,day; //数据成员说明 }; 说明数据成员时不允许进行初始化(某些静态数据成员除 外)。例如: class A { int x=0; //Error const double y=0.0; //Error ...... };
21
数据成员
类 和 对 象
数据成员的类型可以是任意的C++类型(void除外)。 在说明一个数据成员的类型时,如果未见到相应的类型 定义或相应的类型未定义完,则该数据成员的类型只能 是这些类型的指针或引用类型(静态成员除外)。例如: class A;//A是在程序其它地方定义的类,这里是声明。 class B { A a; //Error,未见A的定义。 B b; //Error,B还未定义完。 A *p; //OK B *q; //OK A &aa; //OK B &bb; //OK static B shared; //OK };
类外访问
28
成员函数
类 和 对 象
类成员函数名是可以重载的(析构函数除外), 它遵循一般函数名的重载规则。例如:
class A { ...... public: void f(); int f(int i); double f(double d); ...... };
也允许声明带缺省形参值的成员函数
多态:一段代码能够处理多种类型对象的 能力。 目的:达到行为标识统一,减少程序中标 识符的个数。 多态性实现机制:
强制多态:数据类型的显式或隐式转换 重载多态:函数和操作符重载——第八章 类型参数化多态:函数模板和类模板——第九章 包含多态:虚函数——第八章
13
OOP
本章内容
class A { ... void f() {...} //建议编译器按内联函数处理。 };
等价于: 类外定义: Inline A::void f() {...}
26
例:时钟类的定义
类 和 对 象
class Clock { public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; }; void Clock::SetTime(int NewH, int NewM, int NewS) { Hour=NewH; Minute=NewM; Second=NewS; } void Clock::ShowTime( ) { cout<<Hour<<“:”<<Minute< <“:”<<Second<<endl; }