C++语言程序设计第四章类与对象本章内容⏹面向对象程序设计的基本特点⏹类和对象⏹构造函数和析构函数⏹类的组合⏹UML图形标识⏹结构体和联合体⏹程序实例本章内容⏹面向对象程序设计的基本特点⏹类和对象⏹构造函数和析构函数⏹类的组合⏹UML图形标识⏹结构体和联合体⏹程序实例回顾:面向过程的设计方法⏹重点:◆如何实现细节过程,将数据与函数分开。
⏹形式:◆主模块+若干个子模块(main ()+子函数)。
⏹特点:◆自顶向下,逐步求精——功能分解。
⏹缺点:◆效率低,程序的可重用性差。
面向对象的思想面向对象的方法⏹目的:◆实现软件设计的产业化。
⏹观点:◆自然界是由实体(对象)所组成的。
OO 方法是采用对自然界的模仿描述并处理现实问题的方法。
⏹OO 程序设计特点:◆抽象、封装、继承和多态⏹要求:◆高度概括、分类、和抽象。
面向对象的思想面向对象程序设计的基本特点——抽象抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。
◆先注意问题的本质及描述,其次是实现过程或细节。
◆数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。
◆代码抽象:描述某类对象的共有的行为特征或具有的功能。
◆抽象的实现:通过类的声明。
OOP 的基本特点抽象实例——钟表⏹数据抽象:int Hour , int Minute , int Second ⏹功能抽象:SetTime (), ShowTime ()OOP 的基本特点抽象实例——钟表类class Clock {public: void SetTime(int NewH, int NewM,int NewS);void ShowTime ();private:int Hour,Minute,Second;};OOP 的基本特点抽象实例——人⏹数据抽象:char *name ,char *sex , int age , int id ⏹代码抽象:生物属性角度:GetCloth (), Eat (), Step (),…社会属性角度:Work (), Promote (),…OOP 的基本特点面向对象程序设计的基本特点——封装将抽象出的数据成员、代码成员相结合,将它们视为一个整体,即形成“类”。
◆目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。
◆实现封装:类声明中的{}OOP 的基本特点封装实例——钟表类实例:class Clock{public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;};边界:实现封装特定的访问权限OOP的基本特点外部接口面向对象程序设计的基本特点——继承与派生是C++中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。
实现:声明派生类——第七章OOP 的基本特点面向对象程序设计的基本特点——多态性⏹多态:一段代码能够处理多种类型对象的能力。
⏹目的:达到行为标识统一,减少程序中标识符的个数。
⏹多态性实现机制:◆强制多态:数据类型的显式或隐式转换◆重载多态:函数和操作符重载——第八章◆类型参数化多态:函数模板和类模板——第九章◆包含多态:虚函数——第八章OOP的基本特点本章内容⏹面向对象程序设计的基本特点⏹类和对象⏹构造函数和析构函数⏹类的组合⏹UML图形标识⏹结构体和联合体⏹程序实例类和对象——c++中的类⏹类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
⏹利用类可以实现数据的封装、隐藏、继承与派生。
⏹利用类易于编写大型复杂程序,其模块化程度比C 中采用函数更高。
类和对象对象/类(Object&Class)⏹对象是由数据(数据成员、成员变量、实例变量、对象的局部变量等)及能对其实施的操作(成员函数、方法或消息处理过程等)所构成的封装体,它属于值的范畴。
⏹类(对象的类型)描述了对象的特征(数据和操作),它属于类型的范畴。
⏹类是对逻辑上相关的函数和数据的封装,是对问题的抽象描述。
类和对象类的定义⏹时钟类定义:class Clock{public:void SetTime(int NewH, int NewM, int NewS);void ShowTime();private:int Hour,Minute,Second;};⏹C++的类是一种用户自定义类型,定义形式如下:class 类名称{public:公有成员(外部接口)private:私有成员protected:保护型成员类和对象在C++的类定义中,可以用访问控制修饰符public ,private 或protected 来描述对类成员的访问限制。
例如:class A {public: //访问不受限制。
int x;void f();private: //只能在本类和友元中访问。
int y;void g();protected: //只能在本类、派生类和友元中访问。
int z;void h();类和对象在类定义中,可以有多个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();};类和对象⏹类的数据成员和在类的内部使用的成员函数应该指定为private ,只有提供给外界使用的成员函数才指定为public 。
⏹public 访问控制的成员构成了类与外界的一种接口(interface )。
操作一个对象时,只能通过访问对象类中的public 成员来实现。
⏹protected 类成员访问控制具有特殊的作用(继承)。
其差别表现在继承与派生时对派生类的影响不同,第七章讲。
类和对象⏹类定义中的数据成员描述了类的对象所包含的数据的类型,数据成员的说明格式与非成员数据的声明格式相同,例如:class Date //类定义{......private: //访问控制说明int year,month,day; //数据成员说明};⏹说明数据成员时不允许进行初始化(某些静态数据成员除外)。
例如:class A{ int x=0; //Errorconst double y=0.0; //Error......};数据成员的类型可以是任意的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; //OKstatic B shared; //OK };类和对象对象⏹类的对象是该类的某一特定实体,即类类型的变量。
⏹声明形式:类名对象名;⏹例:Clock myClock;类和对象类中成员的访问方式⏹类中成员互访◆直接使用成员名⏹类外访问◆使用“对象名.成员名”方式访问public 属性的成员类和对象通过对象来访问类的成员时要受到类成员访问控制的限制,例如:class A{public:void f(){ ...... //允许访问:x,y,f,g,h}private:int x;void g(){ ...... //允许访问:x,y,f,g,h}protected:int y;void h(){ ...... //允许访问:x,y,f,g,h}};......A a;a.f(); //OK a.x = 1; //Error a.g(); //Error a.y = 1; //Error a.h(); //Error类的成员函数⏹成员函数描述了对类定义中的数据成员所能实施的操作。
⏹成员函数的实现:◆成员函数一般是将函数的原型写在类体中,实现是写在类定义之外的。
◆成员函数的定义也可以放在类定义中,此时形成内联成员函数。
例如:class A {...void f() {...} //建议编译器按内联函数处理。
};等价于:类外定义:类和对象例:时钟类的定义class Clock {public:void SetTime(int NewH, intNewM, 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;}注意:一般将类的实现放在类外定义。
此时,类的成员函数名需要限制,例如类的成员函数⏹成员函数调用中的目的对象:调用成员函数需要使用“.”操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。
⏹类中成员互访◆直接使用成员名⏹类外访问◆使用“对象名.成员名”方式访问public 属性的成员类和对象⏹类成员函数名是可以重载的(析构函数除外),它遵循一般函数名的重载规则。
例如:class A {......public:void f ();int f (int i);double f (double d);......};⏹也允许声明带缺省形参值的成员函数类和对象成员函数内联成员函数⏹内联成员函数与一般的内联函数一样,函数体中不允许有复杂结构(如循环语句和switch 语句)。
⏹内联成员函数的定义方式:◆将函数体放在类的声明中。
◆在类外使用inline 关键字定义的成员函数。
类和对象程序实例#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;};类和对象void Clock :: SetTime(int NewH, int NewM,int NewS){Hour=NewH;Minute=NewM;Second=NewS;}void Clock :: ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}类和对象int main(){ Clock myClock;cout<<"First time set and output:"<<endl;myClock.SetTime();myClock.ShowTime();cout<<"Second time set and output:"<<endl;myClock.SetTime(8,30,30);myClock.ShowTime();return 0;}类和对象抄写------要求会默写this指针类定义中说明的数据成员(静态数据成员除外)对该类的每个对象都有一个拷贝。