《(4.1)--(01)类和对象定义面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《(4.1)--(01)类和对象定义面向对象程序设计.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计第 4 章 类与对象4.1 类和对象类和对象01.类与抽象数据类型类与抽象数据类型02.类的声明和定义类的声明和定义03.类的类的访问属性访问属性04.对象对象的的创建与使用创建与使用03.类的类的成员函数的实现成员函数的实现4.1 类和对象类类对象对象对象是客观事物在计算机中的抽象描述对象是客观事物在计算机中的抽象描述。类是对具有相似属性和行为的一组对象的类是对具有相似属性和行为的一组对象的抽象抽象描述。描述。在C+中,类实际上相当于一种用户自定义的数据类型,对象就是该数据类型的一个变量;类-数据类型 对象-变量 4.1 类和对象01 类与抽象数据类型类与抽象数据类型 抽象抽
2、象忽略问题中与当前事物无关的方面,将注意力放在与当前事物有关的方面。忽略问题中与当前事物无关的方面,将注意力放在与当前事物有关的方面。对象对象类类封装封装信息隐藏信息隐藏抽象抽象实现实现目的目的抽象数据抽象代码抽象抽象抽象“圆形圆形(circle)”数据抽象:数据抽象:double x,y,r;行行为为抽抽象象:setx();sety();setr();draw()抽象是面向对抽象是面向对象方法的核心象方法的核心示例示例示例示例抽象抽象“人人(person)”数据抽象:数据抽象:string name,unsigned age;;行为抽象:行为抽象:void walk();void work(
3、);void disp();class /以关键字以关键字class class 开头开头 public:/公有访问权限公有访问权限:protected:/保护访问权限保护访问权限;private:/私有访问权限,为默认值,可缺省。私有访问权限,为默认值,可缺省。;;/类的实现部分类的实现部分说明部分:包含说明部分:包含说明部分:包含说明部分:包含数据成员数据成员数据成员数据成员的说明和的说明和的说明和的说明和成员函成员函成员函成员函数数数数的说明。成员函数是用来对数据成员进行操作的说明。成员函数是用来对数据成员进行操作的说明。成员函数是用来对数据成员进行操作的说明。成员函数是用来对数据成员进
4、行操作的。的。的。的。实现部分:是用来对成员函数进行实现部分:是用来对成员函数进行实现部分:是用来对成员函数进行实现部分:是用来对成员函数进行定义定义定义定义。02.类的定义类的定义4.1 类和对象私有成员:私有成员:只能被类内的成员函数和只能被类内的成员函数和该类该类的友元函数的友元函数访问访问,而类外部的任何访问都而类外部的任何访问都是非法的。是非法的。公有成员:公有成员:既可被类内的成员函数访问既可被类内的成员函数访问,也也可被类的外部访问可被类的外部访问,是类与外界的接口。是类与外界的接口。/类的说明部分类的说明部分保护成员:保护成员:可以由本类的成员函数访问可以由本类的成员函数访问,
5、也可以由本类的派生类的成员函数访问也可以由本类的派生类的成员函数访问,而类外的任何访问都是非法的而类外的任何访问都是非法的,将在第将在第5 5章章详细介绍。详细介绍。保护成员和私有成员的性质在类中是相似的保护成员和私有成员的性质在类中是相似的只能只能被本类的成员函数访问,不能从类的外部访问被本类的成员函数访问,不能从类的外部访问。4.1 类和对象实现一个人(实现一个人(Person)类为例,来看一下如何定义一个类。我们抽象人的属性有姓名)类为例,来看一下如何定义一个类。我们抽象人的属性有姓名(name)、年龄()、年龄(age)、身高身高(height)、性别、性别(gender);行为有能走
6、路;行为有能走路walk(),能工作能工作work()。用。用+编写编写一个人类一个人类示例。示例。7对于具体问题,应该有哪些成员?对于具体问题,应该有哪些成员?哪些属于公有成员?哪些属于公有成员?哪些属于应该被保护?哪些属于应该被保护?哪些和外界没有关系应该作为私有成员?哪些和外界没有关系应该作为私有成员?私有成员私有成员公有成员公有成员抽象抽象类的类的设计设计【例4-1】声明一个人类。class Person public:void walk();void work();void disp();private:float height;string gender,name;unsigned
7、 age;对外对外接口接口数据数据隐藏隐藏03.类的类的成员函数的实现成员函数的实现类的成员函数可以有多种特殊形式,包括带默认参数值的成员函数、类的成员函数可以有多种特殊形式,包括带默认参数值的成员函数、内联成员函数内联成员函数和和重载成员函数。重载成员函数。【例【例4-1】中的】中的Person类中类中,成员函数成员函数disp没有函数体,只有函数声明部分,类允没有函数体,只有函数声明部分,类允许其函数成员许其函数成员在类中定义在类中定义,也允许函数成员定义在,也允许函数成员定义在类外类外,此时类中,此时类中必须必须有函数有函数声明声明。将成员函数定义成将成员函数定义成非内联的成员函数非内联
8、的成员函数的形式:的形式:在在类声明中类声明中只给出成员函数的只给出成员函数的原型原型,将将成员函数的定义放在类外部成员函数的定义放在类外部。类外定义每个成员函数的格式类外定义每个成员函数的格式函数类型函数类型 类名类名:成员函数名(参数表)成员函数名(参数表)函数体函数体 在在类名类名和和成员成员函数名函数名之间应加上作用域运算之间应加上作用域运算符符“”4.1 类和对象4.1 类和对象【例4-2】声明一个钟表类。#includeusing namespace std;class Clock public:void SetTime(int NewH,int NewM,int NewS);vo
9、id ShowTime();private:int Hour,Minute,Second;void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Second;int main()Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime();return 0;说明说明:(1)(1)在类声明中在类声明中,成员函数原型的参数表中可以不说明参数的名字成员函数原型的参数表中
10、可以不说明参数的名字,而只说明它而只说明它们的类型。例如们的类型。例如:void SetTime(int ,int ,int );但是但是,在类外定义成员函数时在类外定义成员函数时,不但要说明参数表中参数的类型不但要说明参数表中参数的类型,还必须要指出还必须要指出其参数名。例如其参数名。例如:void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;(2)(2)采用采用“在类声明中只给出成员函数的原型在类声明中只给出成员函数的原型,而将成员函数的定义放在类的而将成员函数的定义放在类的外部外部”
11、的定义方式的定义方式,是是C+C+程序设计的良好习惯。程序设计的良好习惯。建议:建议:1.每个类使用两个文件:每个类使用两个文件:头文件(头文件(.h文件)文件)存放类的定义,存放类的定义,源文件(源文件(.cpp文件)文件)存放类成员函数的实现存放类成员函数的实现 2.文件名与类名相同。文件名与类名相同。4.1 类和对象内联成员函数:(1)(1)隐式声明隐式声明 将成员函数直接定义在类的内部。将成员函数直接定义在类的内部。(2)(2)显式声明显式声明 在类声明中只给出成员函数的原型,而成员函数的定义放在类外部。在类声明中只给出成员函数的原型,而成员函数的定义放在类外部。但在类外部成员函数的定
12、义前冠以关键字但在类外部成员函数的定义前冠以关键字“inlineinline”,使它起到内联函数的作使它起到内联函数的作用。用。隐式声明隐式声明class Clock public:void SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void ShowTime()coutHour:Minute:Second;private:int Hour,Minute,Second;将成员函数直接定义在类将成员函数直接定义在类内部,编译时是作为内联函内部,编译时是作为内联函数的方式来处理数的方式来处理(内联函数内
13、联函数隐隐式定义式定义)inline void Clock:void ShowTime()coutHour:Minute:成员名成员名 /通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员 (*指针变量名指针变量名).成员名成员名格式格式3:类名:类名&引用名引用名a=对象名对象名b;/通过对象的引用访问对象中的成员通过对象的引用访问对象中的成员4.1 类和对象04 对象的创建与使用对象的创建与使用【例4-5】定义一个平面上的点类Point,实现设置、移动、获取坐标和输出坐标功能。#include using namespace std;class Point public:
14、void MoveTo(int,int);/设置点的坐标 void Move(int,int);/移动点的坐标 void MoveH(int);/移动点的横坐标 void MoveV(int);/移动点的纵坐标 int GetX();/获取点的横坐标值 int GetY();/获取点的纵坐标值 void Show();/显示点的坐标private:int x,y;/横坐标、纵坐标;void Point:MoveTo(int nx,int ny)/设置点的坐标 x=nx;y=ny;void Point:Move(int hx,int hy)/移动点的坐标 x+=hx;y+=hy;void Poi
15、nt:MoveH(int hx)/移动点的横坐标 x+=hx;void Point:MoveV(int hy)/移动点的纵坐标 y+=hy;int Point:GetX()/获取点的横坐标值 return x;int Point:GetY()/获取点的纵坐标值 return y;void Point:Show()/显示点的坐标 cout(x,y)endl;4.1 类和对象4_1.mp4int main()cout*Point p1 *endl;Point p1;p1.MoveTo(100,200);p1.Show();cout*Point*p2 *MoveH(120);p2-MoveV(220
16、);p2-Show();cout*Point&p3 *endl;Point&p3=p1;p3.Move(50,50);cout(p3.GetX(),p3.GetY()”运算符进行访问。例如:Point p1;Point*p2=&p1;p2-MoveH(120);p2-MoveV(220);p2-Show();4.1 类和对象4.1 类和对象两个同类型的变量之间可以相互赋值。同类型的对象间也可以进行赋值,当一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝逐位拷贝。05 对象赋值语句对象赋值语句#include using namespace std;class Fun public:voi
17、d init(int i,int j)a=i;b=j;void show()couta bendl;private:int a,b;int main()Fun f1,f2;f1.init(12,34);f2=f1;/将对象f1数据成员的值赋给对象f2 f1.show();f2.show();return 0;说明:说明:在使用对象赋值语句进行对象赋值时,两个对象的类型必须相类型必须相同同,如果对象的类型不同,编译时将出错。两个对象之间的赋值,仅仅使这些对象中数据成员相同数据成员相同,而两个对象仍是分离的。上例中对象赋值是通过缺省的赋值运算符函数赋值运算符函数实现的。若对象有指针数据成员,赋值操作可能会产生指针悬挂问题。本小节结束IloveyoumorethanIveeverlovedanywoman.AndIvewaitedlongerforyouthanIvewaitedforanywoman.Iloveyoumorethan谢谢谢谢大大家家