收藏 分享(赏)

c++类与对象1.ppt

上传人:HR专家 文档编号:5778265 上传时间:2019-03-17 格式:PPT 页数:36 大小:227KB
下载 相关 举报
c++类与对象1.ppt_第1页
第1页 / 共36页
c++类与对象1.ppt_第2页
第2页 / 共36页
c++类与对象1.ppt_第3页
第3页 / 共36页
c++类与对象1.ppt_第4页
第4页 / 共36页
c++类与对象1.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、第3讲 类与对象*,类与对象 类的定义 对象 成员函数,0 引言,面向过程程序设计 ( Procedural Programming ) 方法是结构化的程序设计方法:数据与数据的操作分离,要求将数据发送到过程和函数,程序=数据结构+算法。 面向对象程序设计(OOP, Object-Oriented Programming)方法是目前程序设计的主流方法。 数据和作用于这些数据的操作放置在单一的实体内,这个实体就成为对象(object)。OOP的方式,使其能直接反应出现实世界,程序中所有对象都与某些属性和活动相关联。使用对象大大提高了软件的可重用性,使程序更容易开发和维护。该方法很关键的一点是用对

2、象的思想来思考问题,程序可看作一组相互协作的对象的集合。 程序=对象+对象,一个对象的状态(state)用数据域 (data field,也称为数据成员或属性, properties)及它们的当前值来表示。 一个对象的行为(behavior) 由一组函数定义。对一个对象调用一个函数就是请求对象执行一个任务。 例如:一个对象圆有一个数据域-半径radius,它刻画了圆的属性。计算面积是圆的一个行为,可利用函数getArea()来实现。相同类型的对象用一个通用的类来定义,一个类(class)是一个模板或一个蓝图,它定义了对象具有什么样的数据和函数。一个对象就是类的一个实例(instance),创建

3、一个实例称为实例化(instantiation)。,类与对象 class & object,1 类的定义,类的定义由类的声明和实现两部分组成 class是定义类的关键字。 是标识符,用于惟一标识一个类,一般以“C”开头,以区别其他标识符。 是用户定义的数据类型名 一对大括号内是类的说明部分,说明该类的所有成员。,成员函数用于对数据成员处理,又叫“方法”。类定义中的说明部分一般只给出成员函数的原型声明,函数的定义放在类外。,由于不同的类允许有相同名称的成员函数,因此,在类声明外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用域操作符“: ”。,函数返回类型 类名:成员函数名(形参表)

4、函数体; ,类 作用域,class public:; protected:; private:; ; ,成员函数的定义,#include const double PI=3.1415926; double perimeter(double r) double s=r*2*PI;return s; double area(double r) return r*r*PI; void main() double r,l,s; cinr; s=perimeter(r); s=area(r); cout“周长=”lendl “面积=“sendl; ,class Circle private: doubl

5、e radius; public:Circle(double=1);double getArea(); double getRadius(); void setRadius(double); ; Circle:Circle(double newRadius) radius=newRadius; double Circle:getArea() return radius* radius *3.14159; double Circle:getRadius() return radius; void Circle:setRadius(double r) radius=r; ,日期类的定义,#incl

6、ude class CDate public:void Disp(); /显示年月日void SetDate(int y,int m,int d); /设置年月日void SetYear(int y); /设置年void GetDate(int ,实现部分,说明部分,日期类的定义,#include class CDate public:void Disp() /显示年月日coutyear.month.dayendl;void SetDate(int y,int m,int d) /设置年月日year=y; month=m; day=d;void SetYear(int y) /设置年year=

7、y;void GetDate(int ,简单的成员函数可直接放在声明类成员的大括号内,此时该成员函数为内联函数,#include #include “date.h“ void CDate:Disp() coutyear.month.dayendl; void CDate:SetDate(int y,int m,int d) year=y; month=m; day=d; void CDate:SetYear(int y) year=y; void CDate:GetDate(int ,class CDate public:void Disp(); /显示年月日void SetDate(int

8、y,int m,int d); /设置年月日void SetYear(int y); /设置年void GetDate(int ,类实现部分存放在cpp源文件中 Date.cpp,类声明部分存放在.h中,Date.h,类声明和类实现通常分别置于两个文件中,类声明说明类所包含的成员(数据成员及成员函数的原型说明),类实现给出成员函数的定义,两者通常分别置于两个文件中,文件名相同,扩展名不同。类声明为头文件(扩展名.h),类实现为源文件(扩展名.cpp)。,数据成员的封装,为防止客户程序直接修改对象的属性,应使用private关键字将数据成员声明为私有的,即将数据成员封装(data field e

9、ncapsulation). 成员访问限定符(member access specifier) public:公有成员,可被程序中的任何代码访问 protected:保护成员,可被本类的成员函数和友元函数访问,也可被本类的派生类的成员访问 private :私有成员.只能被本类的成员函数及友元类的成员函数访问. 类中的成员若不特别声明(缺省) ,都被视为私有类型。,/*date.h*/ class Date private:int year,month,day; public:void setDate(int y,int m,int d);int isLeapYear( );void prin

10、t( ); ;,/*time.h*/ class Time int hour,minute,second; /private public:void setTime(int h,int m,int s);void showTime(); ;,定义类时应注意的事项,1) 在类声明内不允许对其数据成员进行初始化:因为类是一个数据类型,定义后并没有存储空间,因此不能对数据成员进行初始化(但静态数据成员可在类外进行初始化)。,Class Tdate public: private:int year=1998,month=4,day=9;/不允许对数据成员进行初始化 ;,2) 类中的数据成员的类型可以是

11、任意的,包括整型、浮点型、字符型、数组、指针和引用等,也可以是对象(即另一个类的对象可以作为该类的成员,但自身类的对象是不可以的)。 3) 一般在类中先说明公有成员(用户最关心),后面说明私有成员。 4) 一般将类定义的声明部分放在一个头文件中,而将实现部分放在源文件中。 5) 类的声明为一个声明语句,其后必须加分号“;“。,错,类作用域,类作用域指类定义范围内,包含类的声明与类的实现两部分,在此范围内成员之间可直接相互访问。 由于数据成员和成员函数都是类的组成部分,因此成员函数是可以直接访问数据成员的,不用通过参数进行传递。由此可知,在面向对象程序设计语言中,数据和函数是组合在一起的。 如在

12、Date类中的各个成员函数中均可直接对数据成员(year,month, day )进行访问(读,写)。,class CTime public:void setTime(int h,int m,int s);void disp(); /成员函数 private:int hour,minute,second; /数据成员 ;#include #include “Time.h“ void CTime:setTime(int h,int m,int s) hour=h;minute=m;second=s; void CTime:disp() couthour“:“minute “:“ seconden

13、dl; ,例 时间类的定义,Time.cpp,Time.h,2 对象,数据类型和变量之间存在着联系,数据类型是模板,变量是这种模板的一个实体。“类”类型也有其对应的变量实体即对象。对象是类的实例,可看作“类“类型的变量,但对象又不是普通的变量,对象是数据和操作的封装体。封装的目的就是阻止非法的访问,因此对象实现了信息的隐藏,外部只能通过操作接口/公有成员访问对象数据。对象属于某个已知的类,必须先定义类,然后才能创建对象。 一般对类的使用是在类测试文件中完成的,例如在包含main函数的文件中进行测试。,如何使用类?,对象的创建,对象是类的实例(instance),创建形式为:,类名 对象名列表;

14、,对象可以是一般的对象名,也可以是指向对象的指针名或引用名,也可以是数组。例如:,#include “circle.h“ #include void main() Circle circle1,circle2;Circle cir1=Circle(); /另一种创建对象的方式 ,#include “Time.h“ #include void main() Time myClock, *pClock;Time clock3;/对象数组Time /引用 ,radius,radius,circle1,circle2,Circle circle1,circle2; Circle *pCircle; p

15、Circle=,&circle2,pCircle,Circle c1 = Circle(); Circle *p=new Circle(); /动态申请空间,heap区,对象创建后,则会在内存中(stack区)为对象分配内存空间,此时只为数据成员分配内存空间。,成员函数代码区,访问对象成员,创建对象后,可以使用点运算符“.”,即对象成员访问运算符(object member access operator),来访问对象的公有数据成员,调用对象的公有成员函数。 对象名.成员函数名(实参列表) 对象名.数据成员 例如,创建了两个Circle类的对象circle1,circle2后,可有如下使用:

16、circle1.setRadius(1.5); /对circle1对象调用setRaidus函数 circle2.setRadius(2.8); /对circle2对象调用setRaidus函数,通过指针访问对象成员 -,对象指针指向对象的地址,如: Circle circle1; Circle *pCircle=,例:使用Circle类1,#include “circle.h“ #include void main() Circle circle1,circle2;circle1.setRadius(1.5);circle2.setRadius(2.8);cout“The area of c

17、ircle1 is “ circle1.getArea() endl;cout“The area of circle1 is “ circle2.getArea() endl;,radius=1.5,circle1,radius=2.8,circle2,testCircle.cpp,例:使用Circle类2,#include “circle.h“ #include void main() Circle circle1,circle2;circle1.setRadius(1.5);circle2.radius = 2.8;cout“The area of circle1 is “ circle1

18、.getArea() endl;cout“The area of circle1 is “ circle2.getArea() endl;,error C2248: radius : cannot access private member declared in class Circle,由于数据成员radius为private成员,因此在类的外部不能直接访问。,/ca.h,CA类的声明 class CA public:int a; private:int b; protected:int c; ;,错误提示: error C2248: b : cannot access private m

19、ember declared in class CAsee declaration of b error C2248: c : cannot access protected member declared in class CAsee declaration of c,/testCa.cpp,CA类的使用 #include “ca.h“ #include void main() CA a;a.a=3;a.b=4;a.c=5;couta.aendl; ,理解具有不同访问权限的成员的使用,例:使用Date类,/testDate.cpp #include #include “date.h“ voi

20、d main( ) Date date1,date2;date1.setDate(1996,8,5);date2.setDate(1998,1,20);int leap=date1.isLeapYear( );coutleapendl;int x,y,z;date1.getDate(x,y,z);coutxtytz;coutendl;date2.print( ); ,程序输出结果119996 8 51998/1/20 其中,1表示1996年是闰年。,程序的运行,编写类的声明(.h文件) 文件名任意,一般为类名(不包含C字母),不区分大小写 定义类,包括定义数据成员及成员函数原型说明 编写类的实

21、现(.cpp文件) 一般为类名(不包含C字母) 包含类声明的头文件 给出成员函数的定义(即函数的实现) 编写main函数(.cpp文件,对已编写好的类进行测试) 通常可命名为testXXX.cpp (XXX表示类名) 包含类声明的头文件 应用已定义好的类去创建对象,并使用对象的公有成员,3 成员函数member functions,类的成员函数描述类的行为,又叫“方法“ ,是程序算法的实现部分,是对封装的数据进行操作的唯一途径。 在类声明中给出函数原型的声明,说明函数返回值类型、函数名和函数的参数表;通常在类声明之外给出函数的具体实现. 成员函数可以是 内联函数 带缺省参数的函数 重载函数,函

22、数返回类型 类名:成员函数名(形参表) 函数体 ,1) set 和get函数,如果一个数据成员是私有的,那么在类作用域外的程序中,无法通过类对象来直接访问它。为了使私有数据成员可被访问,可定义一个成员函数get返回数据成员的值;为使私有数据成员可被修改,可提供一个成员函数set为数据成员设置新值。 绝大多数类都有set和get函数。set函数总是负责把数据传入到类中(可看作写操作,修改),get函数负责从类中取出数据(可看作读操作,访问)。 set函数就是一个“设置器”(setter),或称为“更改器” (mutator);而get函数就是一个“获取器” (getter) ,或者称为(acce

23、ssor)。,/* class declaration, circle.h */ class Circle private:double radius; public:double getArea();double getRadius();void setRadius(double); ;,/* circle.cpp, class implementation */ #include “circle.h“ double Circle:getArea() return radius* radius *3.14159; double Circle:getRadius() return radius

24、; void Circle:setRadius(double r) radius=r; ,例:Circle类定义,例: Date类定义,/date.h, Date类的声明部分 class Date public:void setDate(int y,int m,int d);void getDate(int ,/date.cpp, Date类的实现部分 #include “date.h“ #include void Date:setDate(int y,int m,int d) year=y;month=m;day=d; void Date:getDate(int ,class Time pr

25、ivate:int hour,minute,second; public:void setTime(int h,int m,int s); /非内联函数void showTime() /内联函数couthour“:“minute “:“ secondendl; ;,2) 内联函数,内联函数:指在类声明内定义的函数,类外定义的函数缺省情况下都是非内联函数。,对于内联成员函数,编译时在所有调用该函数的地方将装入实际的函数代码。,成员函数的实现放在类声明内,此时默认为内联函数,class Date public:void setDate(int y,int m,int d) /内联函数 year=y

26、; month=m; day=d; int isLeapYear( ) /内联函数 return (year%4=0 ,也可用关键字 inline 强制定义为内联函数,class Time private:int hour,minute,second; /数据成员 public:void setTime(int h,int m,int s);void showTime(); ; inline void Time:showTime() /内联函数 couthour“:“minute “:“ secondendl; ,class Time private:int hour,minute,secon

27、d; /数据成员 public:void setTime(int h,int m,int s);inline void showTime(); ; void Time:showTime() /内联函数 couthour“:“minute “:“ secondendl; ,在类声明外定义的函数缺省情况下都是非内联函数,可用关键字 inline 强制定义为内联函数。 注意内联函数的条件限制。,3) 带默认值的成员函数,void Time: setTime(int h=0,int m=0,int s=0) /成员函数的定义 hour=h;minute=m;second=s; Time myClock

28、; myClock.setTime(); /hour=0,minute=0, second=0 myClock.setTime(11);/hour=11,minute=0, second=0 myClock.setTime(11,20);/hour=11,minute=20, second=0 myClock.setTime(11,20,35);/hour=11,minute=20, second=35 ,函数在定义时可以预先定义出默认的形参值。调用时如果给出实参,则用实参初始化形参,如果没有给出实参,则采用预先定义的默认形参值。,4) 成员函数的重载,void Time: setTime()

29、 /成员函数的定义 hour=0;minute=0;second=0; void Time: setTime(int h,int m,int s) hour=h;minute=m;second=s; Time myClock; myClock.setTime(); /hour=0,minute=0, second=0 myClock.setTime(11,20,35); /hour=11,minute=20, second=35 ,class My_classpublic:int abs(int x);double abs(double x);int My_class:abs(int x)re

30、turn x0?x:x;double My_class:abs(double x)return x0?x:x;,函数重载,重载函数,必须:函数名相同,函数的作用域相同,函数的参数个数或参数类型不同。 使用重载函数时应注意: 只有返回值不同,不能成为重载函数。int test(int a,int b);double test(int a,int b); /错误 使用带缺省值的函数时,可能引发错误。如:int test(int a,int b=0);int test(int c); 当用一个实参调用该函数时,如test(2),则会出现调用歧义性。,作业4,4-1)设计名为Circle的类,表示圆。

31、这个类包含: 一个名为radius的double型数据成员,表示圆的半径. 数据成员的设置器setr和获取器getr函数。 一个名为area()的函数,返回圆的面积。 一个名为perimeter()的函数,返回圆的周长 编写测试主函数:创建2个Circle类对象,将第1个圆的半径设置为2.5,第2个圆的半径设置为3.5,并输出两个圆对象的半径、面积和周长。 4-2)设计名为Cylinder的类,表示圆柱。这个类包含: 名为radius和height的double型数据成员,表示圆柱的半径和高. 数据成员的设置器和获取器函数(6个:4个单个数据和2个同时设置或获取2个数据成员)。 一个名为sur

32、face()的函数,返回圆柱的表面积。 一个名为volume()的函数,返回圆柱的体积。 编写测试主函数:创建2个Cylinder 类对象,将第1个圆柱的半径和高设置为2.5和4,第2个圆柱的半径和高设置为3.5和6,并输出两个圆柱对象的表面积和体积。,作业4,4-3)设计名为Complex的类表示复数矩形。这个类包含: 名为real和image的double型数据成员,存放实部和虚部 所有数据成员的设置器和获取器函数(2个:同时设置/获取2个数据成员)。 一个名为show()的函数,安复数形式输出。 一个名为add的函数,求两个复数的和。 一个名为minus的函数,求两个复数的差。 编写测试

33、主函数,创建3个Complex类对象,输入两个复数的实部和虚部,求它们的和与差并输出。 4-4)设计名为Time的类表示时间,包含: 3个int型的数据成员hour、minute和second,存放时分秒。 时分秒的设置器和获取器函数(2个:同时设置/获取2个数据成员) 。 名为addsecond的函数,将时间加上秒数得到其和的时间。 编写测试主函数。,作业4,4-5)设计名为Rect的类,表示矩形。这个类包含: 名为width和height的double型数据成员,表示矩形的宽和高 所有数据成员的设置器和获取器函数(2个:同时设置/获取2个数据成员,其中设置器函数带缺省参数值1和1)。 一个

34、名为area()的函数,返回矩形的面积。 一个名为perimeter()的函数,返回矩形的周长。 编写测试主函数,创建2个Rect类对象,将第一个矩形的宽/高设置为4/40,第2个矩形的宽/高设置为3.5/35.9,并输出两个矩形对象的属性(宽和高)、面积和周长。 4-6)设计名为MyPoint的类表示直角坐标系中的一个点。包含: 两个int型的数据成员x和y,表示坐标。 x和y的设置器和获取器函数(3个:同时设置/获取2个数据成员,其中设置器函数重载:无参的(值为0和0)和有参的) 。 一个名为distance的函数,返回当前点和另一个给定的MyPoint类型的点之间的距离。 编写测试主函数,创建两个点(0,0)和 (10,30.5),并输出两点之间的距离。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报