下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章类和对象的特性本章要点面向对象程序设计方法概述类的声明和对象的定义类的成员函数对象成员的引用8.1面向对象程序设计方法概述面向对象的程序设计的思路和日常生活中处理问题的思路类似。在生活中,一个复杂的事物总是由许多部分组成的。例如:生产汽车时,分别设计和制造发动机、底盘、车身和轮子,最后把它们组装在一起。在组装时,各部分之间有一定的联系,以便协调工作。8.1面向对象程序设计方法概述1.对象:现实世界实际存在的任何一个事物都可以看成一个对象。对象可大可小。对象是构成系统的基本单位。任何一个对象都具有两个要素,即属性(attribute)和行为(behavior),对象能根据外界给的信息进行相应的操作。对象是由一组属性和一组行为构成的。8.1面向对象程序设计方法概述按钮对象:按钮的属性:按钮的内容、大小,按钮的字体、图案等等。这些属性是静态特征;按钮的行为:针对按钮的各种操作,创建、单击、双击、拖动等。这些行为是动态特征。班级对象:班级的属性:所属的系和专业、班级的人数,所在的教室等。这些属性是静态特征;班级的行为:如学习、开会、体育比赛等。这些行为是动态特征。8.1面向对象程序设计方法概述面向对象的程序设计采用了以上的这种思路。使用面向对象的程序设计方法设计一个复杂的软件系统时,1.确定该系统是由哪些对象组成的2.设计这些对象。在C++中,每个对象都是由数据和函数(即操作代码,也叫作方法method)这两部分组成的。8.1面向对象程序设计方法概述例如一个三角形对象数据(属性):它的3个边长。函数(行为,方法):是用来对三角形的属性进行操作的,以便实现某些功能,例如计算三角形的面积,输出三角形的边长和面积等等。计算三角形面积和输出有关数据就是前面提到的行为,在程序设计方法中也称为方法(method)。调用对象中的函数就是向该对象传送一个消息(message),要求该对象实现某一行为(功能)。8.1面向对象程序设计方法概述2.封装与信息隐蔽可以对一个对象进行封装处理,把它的一部分属性(数据)和功能(函数)对外界屏蔽,也就是说从外界是看不到的,甚至是不可知的。封装一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。隐蔽有利于数据安全,防止无关的人了解和修改数据。8.1面向对象程序设计方法概述C++的对象中的函数名就是对象的对外接口,外界可以通过函数名来调用这些函数,以便实现某些行为(功能)。使用对象的人可以不用知道对象内部的具体细节,只需了解外部功能,就可以自由地操作对象。把对象的内部实现和外部行为分隔开来。8.1面向对象程序设计方法概述传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用。程序设计者必须考虑每一个细节,什么时候对什么数据进行操作。面向对象程序设计采取的是另外一种思路。它面对的是一个个对象。实际上,每一组数据都是有特定的用途的,是某种操作的对象。也就是说,一组操作调用一组数据。8.1面向对象程序设计方法概述程序设计者的任务包括两个方面:一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。各个对象的操作完成了,整体任务也就完成了。
所以人们把相关的数据和操作放在一起,形成一个整体,与外界相对分隔。这就是面向对象的程序设计中的对象。8.1面向对象程序设计方法概述在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序∶
程序=算法+数据结构面向对象的程序组成:对象=算法+数据结构程序=(对象+对象+对象+……)+消息消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象以及确定向这些对象发出的命令(消息),使各对象完成相应的操作。8.2类的声明和对象的定义每一个实体都是一个对象。有一些对象是具有相同的结构和特性的。即:每个对象都属于一个特定的类型。
在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例(instance)。
和普通类型的对比inta;int是类型(类),包括值和可以进行的操作,而a是该类型具体的对象面向对象程序设计,需要自己先声明类型(类),再定义对象(该类型的变量)类是抽象的,不占用内存,而对象是具体的,占用存储空间。类的定义格式:class类名{private:
成员数据;
成员函数;
public:
成员数据;
成员函数;
protected:
成员数据;
成员函数;};关键字类名私有公有保护classStudent{private:charName[20];floatMath;floatChiese;
public:floataverage;
voidSetName(char*name);voidSetMath(floatmath);voidSetChinese(floatch);floatGetAverage(void);};分号不能少8.2类的声明private,public,protected:成员访问限定符用关键字private限定的成员称为私有成员,私有成员只能在该类的内部使用,即1.私有的成员数据,只能被该类中的成员函数使用2.私有的成员函数,只能被该类内的成员函数调用类就相当于私有成员的作用域。用关键字public限定的成员称为公有成员,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的。8.2类的声明用关键字protected所限定的成员称为保护成员,保护的数据或函数,只允许在类内及该类的派生类中使用。即保护成员的作用域是该类及该类的派生类。8.2类的声明每一个成员访问限定符(private等)在类体中可使用多次。一旦使用了限定符,该限定符一直有效,直到下一个限定符开始为止。如果未加说明,类中成员默认的访问权限是private,即私有的。在声明类类型时,声明为private的成员和声明为public的成员的次序任意。多数先写public部分,把private部分放在类体的后面。这样可以使用户将注意力集中在能被外界调用的成员上,使阅读者的思路更清晰一些。classStudent{ charName[20]; floatMath; floatChiese;
public: floataverage;voidSetName(char*name); voidSetMath(floatmath); voidSetChinese(floatch); floatGetAverage(void);};均为私有成员均为公有成员classA{floatx,y;public:
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; A私有数据公有函数在类外不能直接使用x或y,必须通过Setxy()给x或y赋值,通过Print()输出x或y。在类体外怎么访问私有成员?成员函数与成员数据的定义不分先后,还可以先声明函数原型,再在类体外定义函数体。classA{floatx,y;public:
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; 在类体内定义成员函数classA{floatx,y;public:
voidSetxy(floata,floatb);
voidPrint(void);};
voidA::Setxy(floata,floatb){x=a;y=b;}voidA::Print(void){cout<<x<<‘\t’<<y<<endl;}在类体内声明成员函数原型在类体外定义成员函数类名作用域限定符
内联(inline)成员函数当我们定义一个类时,可以在类中直接定义函数体。这时成员函数在编译时是作为内联函数来实现的。即不是真正地执行函数的调用,而是把函数代码嵌入程序的调用点。如果需要在类体外定义类的内联函数:函数的声明前加关键字inline,或者在类体外定义时,在成员函数的定义前面加上关键字inline。classA{floatx,y;public:voidSetxy(floata,floatb);
inlinevoidPrint(void);}; inlinevoidA::Setxy(floata,floatb){x=a;y=b;}voidA::Print(void){cout<<x<<‘\t’<<y<<endl;}说明该成员函数为内联<type><class_name>::<func_name>(<参数表>){......//函数体}在类体外定义成员函数的格式:voidA::Setxy(floata,floatb){x=a;y=b;}函数类型类名函数名形参列表函数体作用域限定符如果在作用域运算符“∷”的前面没有类名,或者函数名前面既无类名又无作用域运算符“∷”表示函数不属于任何类,这个函数不是成员函数,而是全局函数类的声明在定义一个类时,要注意:在定义类时,只是定义了一种数据类型,并没有为类分配存储空间,所以,在定义类中的数据成员时,不能对类中的数据成员进行初始化。如:classTest{intx=5,y=6;//是不允许的}对象的定义在定义类时,只是定义了一种数据类型,即说明程序中可能会出现该类型的数据,并没有给类分配存储空间。只有在定义了属于类的变量之后,系统才会给类的变量分配空间。类的变量我们称之为对象。对象是类的实例,定义对象之前,一定要先说明该对象的类。8.2.3对象的定义一个对象所占的存储空间大小只取决于对象中数据成员所占空间,成员函数的代码是存储在对象空间之外的。不同对象占据内存中的不同区域,它们所保存的数据各不相同,但是对成员数据进行操作的成员函数的程序代码都是一样的。成员函数的代码被每个对象共享。数据1数据2数据N…对象1对象2对象N公用的成员函数代码8.2.3定义对象的方法先声明类类型,再定义对象在声明类类型的同时定义对象不出现类名,直接定义对象如:classstudent{private:intnum;charname[20];public:voiddisplay();};studentstu1,stu2;如:classstudent{private:intnum;charname[20];public:voiddisplay();}stu1,stu2;如:class{private:intnum;charname[20];public:voiddisplay();}stu1,stu2;8.4对象成员的引用一个对象的成员就是该对象的类所定义的成员,包括成员数据和成员函数,访问对象中的成员可以有3种方法:通过对象名和成员运算符访问对象中的成员;通过指向对象的指针访问对象中的成员;通过对象的引用变量访问对象中的成员。8.4.1通过对象名和成员运算符访问对象中的成员一般形式:对象名.成员名
例如:
stud1.num=100;stud1.display();其中“.”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员。注意不能只写成员名而忽略对象名。num=100;在类外只能访问public成员,不能访问private成员。stud1.sex=‘M’;classStudent{ charsex;public: intnum; charname[20]; voiddisplay();}stud1;××8.4.2通过指向对象的指针访问对象中的成员访问的一般形式为:
(*指向对象的指针变量).成员名或:指向对象的指针变量->成员名->:成员指向运算符classTime{public://数据成员是公用的inthour;intminute;};Timet,*p;//定义对象t和指针变量pp=&t;//使p指向对象tcin>>p->hour;//输入p指向的对象中的成员hour在p指向t的前提下,p->hour,(*p).hour和t.hour三者等价。8.4.3通过对象的引用变量来访问对象中的成员如果为一个对象定义了一个引用变量,则对象和引用占用同一段存储单元,实际上是同一个对象,只是用不同的名字表示。此时可以通过引用来访问对象中的成员。如果已声明了Time类,并有以下定义语句:Timet1;//定义对象t1Time&t2=t1;//定义Time类引用变量t2,初始化为t1cout<<t2.hour;//输出对象t1中的成员hour由于t2与t1共占同一段存储单元(即t2是t1的别名),因此t2.hour就是t1.hour。例如:第8.6节的例8.2中的程序(b)8.5类的封装性和信息隐蔽略8.6类和对象的简单应用举例例8.1:输入输出用时:分:秒表示的时间#include<iostream>usingnamespacestd;classTime{public:
inthour;intminute;intsec;};intmain(){Timet1;cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;return0;}例8.2(1):引用多个对象的成员#include<iostream>usingnamespacestd;classTime{public:
inthour;intminute;intsec;};intmain(){Timet1;cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;
Timet2;cin>>t2.hour;cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<″:″<<t2.minute<<″:″<<t2.sec<<endl;return0;}例8.2(2):用普通函数输入输出intmain(){voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}voidset_time(Time&t){cin>>t.hour;cin>>t.minute;cin>>t.sec;}voidshow_time(Time&t){cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;}classTime{public:
inthour;intminute;intsec;};例8.3:用成员函数输入输出#include<iostream>usingnamespacestd;classTime{public:voidset_time();voidshow_time();private:inthour;intminute;intsec;};voidTime∷show_time(){cout<<hour<<″:″<<minute<<″:″<<sec<<endl;}intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();return0;}voidTime∷set_time(){cin>>hour;cin>>minute;cin>>sec;}例8.4用面向对象的方法,设计一个类,找出一个整型数组中的元素的最大值。classArray_max{private:intarray[10];intmax;
public:
voidset_value();voidmax_value();voidshow_value();};voidArray_max∷set_value(){inti;for(i=0;i<10;i++)cin>>array[i];}voidArray_max∷max_value(){inti;max=array[0];for(i=1;i<10;i++)if(array[i]>max)max=array[i];}voidArray_max∷show_value(){cout<<″max=″<<max;}intmain(){Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0;}classA{floatx,y;public:floatm,n;
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=10;a1.n=20; //为公有成员数据赋值
a1.x=2;a1.y=5;
a1.Setxy(2.0,5.0);
a1.Print();}必须通过类内公有函数访问私有数据成员非法,私有成员不能在类外访问同类型的对象之间可以整体赋值,这种赋值与对象的成员的访问权限无关。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=10;a1.n=20; //为公有成员数据赋值
a1.Setxy(2.0,5.0);
a2=a1;a1.Print();a2.Print();}同类型的对象之间可以整体赋值相当于成员数据间相互赋值类作用域、类类型的作用域和对象的作用域类体的区域称为类作用域。类的成员函数和成员数据,作用域都是属于类的作用域,仅在该类的范围内有效,故不能在主函数中直接通过函数名和成员名来调用成员函数和直接访问成员数据。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=20;a1.n=10;
a1.Setxy(2.0,5.0);
a1.Print();}voidmain(void){Aa1,a2;
m=20;n=10;
Setxy(2.0,5.0);
Print();
}用对象名调用不能直接调用类作用域、类类型的作用域和对象的作用域类类型的作用域:在函数定义之外定义的类,其类名的作用域为文件作用域;而在函数体内定义的类,其类名的作用域为块作用域。对象的作用域与前面介绍的变量作用域完全相同,全局对象、局部对象等。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}a3,a4;voidmain(void){Aa1,a2;
classB{inti,j;public:voidSetij(intm,intn){i=m;j=n;}};Bb1,b2;a1.Setxy(2.0,5.0);b1.Setij(1,2);}类A:文件作用域,在整个文件中有效类B:块作用域,在函数内有效。全局对象局部对象类的对象如何引用私有数据成员1、通过公有函数为私有成员赋值classTest{ intx,y;public:voidSetxy(inta,intb){x=a; y=b;}voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Testp1,p2;
p1.Setxy(3,5); p1.Printxy();}调用公有函数为私有成员赋值2、利用指针访问私有数据成员classTest{ intx,y;public:voidSetxy(inta,intb){x=a; y=b;}
voidGetxy(int*px,int*py){*px=x;*py=y;}//提取x,y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;p1.Getxy(&a,&b);//将a=x,b=ycout<<a<<'\t'<<b<<endl;}35ba&apx&bpy35输出:3 53、利用函数访问私有数据成员classTest{ intx,y;public:voidSetxy(inta,intb){x=a; y=b;}
intGetx(void){returnx;}//返回x值
intGety(void){returny;}//返回y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;a=p1.Getx();b=p1.Gety();//将a=x,b=ycout<<a<<'\t'<<b<<endl;}函数的返回值就是私有成员变量的值4、利用引用访问私有数据成员classTest{ intx,y;public:voidSetxy(inta,intb){ x=a;y=b;}
voidGetxy(int&px,int&py){px=x; py=y; }//提取x,y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;
p1.Getxy(a,b);//将a=x,b=ycout<<a<<'\t'<<b<<endl;}35bapxpy35输出:3 5类引用举例(三角形类:三角形的三边及与三边相关的运算)classTriangle{private: floata,b,c;//三边为私有成员数据public: voidSetabc(floatx,floaty,floatz);//置三边的值
voidGetabc(float&x,float&y,float&z);//取三边的值
floatPerimeter(void);//计算三角形的周长
floatArea(void);//计算三角形的面积
voidPrint(void);//打印相关信息};voidTriangle::Setabc(floatx,floaty,floatz){a=x;b=y;c=z;}//置三边的值voidTriangle::Getabc(float&x,float&y,float&z)//取三边的值
{x=a; y=b; z=c;}floatTriangle::Perimeter(void){return(a+b+c);}//计算三角形的周长floatTriangle::Area(void)//计算三角形的面积{floatarea,p;p=Perimeter()/2;area=sqrt((p-a)*(p-b)*(p-c)*p);returnarea;}voidTriangle::Print(void)//打印相关信息{cout<<"Peri="<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京印刷学院《竹木雕技法》2023-2024学年第一学期期末试卷
- 业务部年度工作计划9篇
- 二零二五年度企业固定资产抵押贷款合同样本3篇
- 2024年樘木项目可行性研究报告
- 装载机租赁合同
- 二手车买卖合同
- 2024年眼镜角套项目可行性研究报告
- 2025年度智慧CRM系统升级版:助力企业销售合同高效管理的智能解决方案2篇
- 2025版空场地租赁合同范本-租赁合同解除后的处理83篇
- 北京信息职业技术学院《电视栏目专题与制作》2023-2024学年第一学期期末试卷
- 医药销售培训课程
- 2022-2023学年北京市海淀区七年级(上)期末语文试卷
- 膝关节炎阶梯治疗
- 设备日常维护及保养培训
- 行业背景、经济运行情况及产业未来发展趋势分析
- 配电室维护协议书
- 2024年度工作总结模板简约干练风格
- 2024年广东省第一次普通高中学业水平合格性考试历史试卷(解析版)
- 部编版一年级上册语文期末试题含答案
- 2025届东莞东华高级中学高一生物第一学期期末考试试题含解析
- 新疆巴音郭楞蒙古自治州库尔勒市2024-2025学年高一生物上学期期末考试试题
评论
0/150
提交评论