Chap4类与对象1

上传人:lx****y 文档编号:243009766 上传时间:2024-09-13 格式:PPT 页数:34 大小:104.50KB
返回 下载 相关 举报
Chap4类与对象1_第1页
第1页 / 共34页
Chap4类与对象1_第2页
第2页 / 共34页
Chap4类与对象1_第3页
第3页 / 共34页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,讲 类与对象*,类与对象,类的定义,对象,1,0,引言,面向过程程序设计,( Procedural Programming ),方法是结构化的程序设计方法:数据与数据的操作分离,要求将数据发送到过程和函数,,程序,=,数据结构,+,算法,。,面向对象程序设计,(OOP, Object-Oriented Programming),方法是目前程序设计的主流方法。,数据和作用于这些数据的操作放置在单一的实体内,这个实体就成为,对象,(,object,),。,OOP,的方式,使其能直接反应出现实世界,程序中所有对象都与某些属性和活动相关联。使用对象大大提高了软件的可重用性,使程序更容易开发和维护。该方法很关键的一点是用对象的思想来思考问题,程序可看作一组相互协作的对象的集合。,程序,=,对象,+,对象,2,一个对象的状态,(state),用数据域,(data field,也称为数据成员或属性, properties),及它们的当前值来表示。,一个对象的行为,(behavior),由一组函数定义。对一个对象调用一个函数就是请求对象执行一个任务。,例如:一个对象圆有一个数据域,-,半径,radius,,它刻画了圆的属性。计算面积是圆的一个行为,可利用函数,getArea(),来实现。,相同类型的对象用一个通用的类来定义,一个类,(class),是一个模板或一个蓝图,它定义了对象具有什么样的数据和函数。一个对象就是类的一个实例,(instance),创建一个实例称为实例化,(instantiation),。,类与对象,class & object,3,1,类的定义,类的定义由,类的声明和实现,两部分组成,class,是定义类的关键字。,是标识符,用于惟一标识一个类,一般以“,C”,开头,以区别其他标识符。,是用户定义的数据类型名,一对大括号内是类的说明部分,说明该类的所有成员。,成员函数用于对数据成员处理,又叫“方法”。类定义中的说明部分一般只给出成员函数的原型声明,函数的定义放在类外。,由于不同的类允许有相同名称的成员函数,因此,在类声明外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用域操作符“,:,”,。,函数返回类型,类名,:,成员函数名(形参表),函数体,;,类,作用域,class,public,:,;,protected,:,;,private,:,;,;,成员函数的定义,4,日期类的定义,#include ,class,CDate,public:,void Disp();,/,显示年月日,void SetDate(int y,int m,int d);,/,设置年月日,void SetYear(int y);,/,设置年,void GetDate(int ,/,获取年月日,int GetYear();,/,获取年,int isLeapYear();,/,判断某年是否为闰年,private:,int year,month,day;,/,数据成员,分别表示年月日,;,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 &y,int &m,int &d),y=year; m=month;d=day;,int,CDate:,GetYear(),return year;,int,CDate:,isLeapYear( )/,判断某年是否为闰年,return (!(year%4) ,实现部分,说明部分,5,日期类的定义,#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=y;,void GetDate(int &y,int &m,int &d),/,获取年月日,y=year;m=month;d=day;,int GetYear(),/,获取年,return year;,int isLeapYear(),/,判断某年是否为闰年,return (!(year%4) ,private:,int year,month,day;,/,数据成员,分别表示年月日,;,简单的成员函数可直接放在声明类成员的大括号内,此时该成员函数为内联函数,6,#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 &y,int &m,int &d),y=year; m=month;d=day;,int,CDate:,GetYear(),return year;,int,CDate:,isLeapYear( )/,判断某年是否为闰年,return (!(year%4) ,class,CDate,public:,void Disp();,/,显示年月日,void SetDate(int y,int m,int d);,/,设置年月日,void SetYear(int y);,/,设置年,void GetDate(int ,/,获取年月日,int GetYear();,/,获取年,int isLeapYear();,/,判断某年是否为闰年,private:,int year,month,day;,/,数据成员,分别表示年月日,;,类实现部分存放在,cpp,源文件中,Date.cpp,类声明部分存放在,.h,中,,Date.h,类声明和类实现通常分别置于两个文件中,类声明说明类所包含的成员,(,数据成员及成员函数的原型说明,),,类实现给出成员函数的定义,两者通常分别置于两个文件中,文件名相同,扩展名不同。类声明为头文件,(,扩展名,.h),,类实现为源文件,(,扩展名,.cpp),。,7,数据成员的封装,为防止客户程序直接修改对象的属性,应使用,private,关键字将数据成员声明为私有的,即将数据成员封装,(,data field encapsulation,).,成员访问限定符,(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 print( );,;,/*time.h*/,class Time,int hour,minute,second; /private,public:,void setTime(int h,int m,int s);,void showTime();,;,8,定义类时应注意的事项,1),在类声明内不允许对其数据成员进行初始化,:因为类是一个数据类型,定义后并没有存储空间,因此不能对数据成员进行初始化(但静态数据成员可在类外进行初始化)。,Class Tdate,public:,private:,int year=1998,month=4,day=9;,/,不允许对数据成员进行初始化,;,2),类中的数据成员的类型可以是任意的,包括整型、浮点型、字符型、数组、指针和引用等,也可以是对象,(,即另一个类的对象可以作为该类的成员,但自身类的对象是不可以的,),。,3),一般在类中先说明公有成员,(,用户最关心,),,后面说明私有成员。,4),一般将类定义的声明部分放在一个头文件中,而将实现部分放在源文件中。,5),类的声明为一个声明语句,其后必须加分号,;,。,错,9,类作用域,类作用域指类定义范围内,包含类的声明与类的实现两部分,在此范围内成员之间可直接相互访问。,由于数据成员和成员函数都是类的组成部分,因此成员函数是可以直接访问数据成员的,不用通过参数进行传递。由此可知,在面向对象程序设计语言中,数据和函数是组合在一起的。,如在,Date,类中的各个成员函数中均可直接对数据成员(,year,,,month, day ),进行访问(读,写)。,10,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, : second,对象指针指向对象的地址,如:,Circle circle1;,Circle *pCircle=,(*pCircle).getRadius(); /,成员运算符,.,pCircle-getRadius(); /,箭头,-,(*pCircle).getArea();,pCircle-getArea();,16,例:使用,Circle,类,1,#include circle.h,#include,void main(),Circle circle1,circle2;,circle1.setRadius(1.5);,circle2.setRadius(2.8);,coutThe area of circle1 is ,circle1.getArea(), endl;,coutThe area of circle1 is , circle2.getArea() endl;,radius=1.5,circle1,radius=2.8,circle2,testCircle.cpp,17,例:使用,Circle,类,2,#include circle.h,#include,void main(),Circle circle1,circle2;,circle1.setRadius(1.5);,circle2.radius = 2.8;,coutThe area of circle1 is ,circle1.getArea() endl;,coutThe area of circle1 is , circle2.getArea() endl;,error C2248: radius : cannot access private member declared in class Circle,由于数据成员,radius,为,private,成员,因此在类的外部不能直接访问。,18,/ca.h,,,CA,类的声明,class CA,public:,int a;,private:,int b;,protected:,int c;,;,错误提示:,error C2248: b : cannot access private member declared in class CA,see declaration of b,error C2248: c : cannot access protected member declared in class CA,see 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;,理解具有不同访问权限的成员的使用,19,例:,使用,Date,类,/testDate.cpp,#include ,#include date.h,void 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( );,程序输出结果,1,19996 85,1998/1/20,其中,,1,表示,1996,年是闰年。,20,程序的运行,编写类的声明,(.h,文件,),文件名任意,一般为类名(不包含,C,字母),不区分大小写,定义类,包括定义数据成员及成员函数原型说明,编写类的实现,(.cpp,文件,),一般为类名(不包含,C,字母),包含类声明的头文件,给出成员函数的定义(即函数的实现),编写,main,函数,(.cpp,文件,对已编写好的类进行测试,),通常可命名为,test,XXX.cpp (XXX,表示类名),包含类声明的头文件,应用已定义好的类去创建对象,并使用对象的公有成员,21,3,成员函数,member functions,类的成员函数描述类的行为,又叫,方法,,是程序算法的实现部分,是对封装的数据进行操作的唯一途径。,在类声明中给出函数原型的声明,说明函数返回值类型、函数名和函数的参数表;通常在类声明之外给出函数的具体实现,.,成员函数可以是,内联函数,带缺省参数的函数,重载函数,函数返回类型,类名,:,成员函数名(形参表),函数体,22,1) set,和,get,函数,如果一个数据成员是私有的,那么在类作用域外的程序中,无法通过类对象来直接访问它。为了使私有数据成员可被访问,可定义一个成员函数,get,返回数据成员的值;为使私有数据成员可被修改,可提供一个成员函数,set,为数据成员设置新值。,绝大多数类都有,set,和,get,函数。,set,函数总是负责把数据传入到类中(可看作写操作,修改),,get,函数负责从类中取出数据(可看作读操作,访问)。,set,函数就是一个“设置器”,(setter),或称为“更改器”,(mutator),;而,get,函数就是一个“获取器”,(getter),,或者称为,(accessor),。,23,/*,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;,void Circle:setRadius(double r),radius=r;,例:,Circle,类定义,24,例:,Date,类定义,/date.h,Date,类的声明部分,class Date,public:,void setDate(int y,int m,int d);,void getDate(int ,int isLeapYear( );,void print( );,private:,int year,month,day;,;,25,/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 &y, int &m, int &d),y=year, m =month, d =day;,int Date:isLeapYear( ),return (year%4=0 ,void Date:print( ),coutyear/month/dayendl;,26,class Time,private:,int hour,minute,second;,public:,void setTime(int h,int m,int s);,/,非,内联,函数,void showTime() /,内联,函数,couthour:minute : secondendl;,;,2),内联函数,内联函数:,指在类声明内定义的函数,,类外定义的函数缺省情况下都是非内联函数,。,对于内联成员函数,编译时在所有调用该函数的地方将,装入实际的函数代码。,27,成员函数的实现放在类声明内,此时默认为内联函数,class Date,public:,void setDate(int y,int m,int d),/,内联,函数, year=y; month=m; day=d; ,int isLeapYear( ),/,内联,函数, return (year%4=0 ,void print( ),/,内联,函数, coutyear/ month/dayendl; ,private:,int year,month,day;,;,28,也可用关键字,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,second; /,数据成员,public:,void setTime(int h,int m,int s);,inline,void showTime();,;,void Time:showTime() /,内联,函数,couthour:minute : secondendl;,在类声明,外定义的函数缺省情况下都是非内联函数,,,可用关键字,inline,强制,定义为内联函数,。,注意,内联函数,的条件限制。,29,3),带默认值的成员函数,void Time: setTime(int h=0,int m=0,int s=0) /,成员函数的定义,hour=h;,minute=m;,second=s;,Time myClock;,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,函数在定义时可以预先定义出默认的形参值。调用时如果给出实参,则用实参初始化形参,如果没有给出实参,则采用预先定义的默认形参值。,30,4),成员函数的重载,void Time:,setTime,() /,成员函数的定义,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_class,public:,int,abs,(int x);,double,abs,(double x);,;,int My_class:abs(int x),return x0?x:x;,double My_class:abs(double x),return x0?x:x;,31,函数重载,重载函数,必须:函数名相同,函数的作用域相同,函数的参数个数或参数类型不同。,使用重载函数时应注意:, 只有返回值不同,不能成为重载函数。,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),,则会出现调用歧义性。,32,作业,1,1-1,)设计名为,Circle,的类,表示圆。这个类包含:,一个名为,radius,的,double,型数据成员,表示圆的半径,.,数据成员的设置器,setr,和获取器,getr,函数。,一个名为,area(),的函数,返回圆的面积。,一个名为,perimeter(),的函数,返回圆的周长,编写测试主函数:创建,2,个,Circle,类对象,将第,1,个圆的半径设置为,2.5,,第,2,个圆的半径设置为,3.5,,并输出两个圆对象的半径、面积和周长。,1-2,)设计名为,Cylinder,的类,表示圆柱。这个类包含:,名为,radius,和,height,的,double,型数据成员,表示圆柱的半径和高,.,数据成员的设置器和获取器函数,(6,个:,4,个单个数据和,2,个同时设置或获取,2,个数据成员,),。,一个名为,surface(),的函数,返回圆柱的表面积。,一个名为,volume(),的函数,返回圆柱的体积。,编写测试主函数:创建,2,个,Cylinder,类对象,将第,1,个圆柱的半径和高设置为,2.5,和,4,,第,2,个圆柱的半径和高设置为,3.5,和,6,,并输出两个圆柱对象的表面积和体积。,33,作业,1,1-3,)设计名为,Rect,的类,表示矩形。这个类包含:,名为,width,和,height,的,double,型数据成员,表示矩形的宽和高,所有数据成员的设置器和获取器函数,(2,个:同时设置,/,获取,2,个数据成员,其中设置器函数带缺省参数值,1,和,1),。,一个名为,area(),的函数,返回矩形的面积。,一个名为,perimeter(),的函数,返回矩形的周长。,编写测试主函数,创建,2,个,Rect,类对象,将第一个矩形的宽,/,高设置为,4/40,,第,2,个矩形的宽,/,高设置为,3.5/35.9,,并输出两个矩形对象的属性,(,宽和高,),、面积和周长。,1-4,)设计名为,MyPoint,的类表示直角坐标系中的一个点。包含:,两个,int,型的数据成员,x,和,y,,表示坐标。,x,和,y,的设置器和获取器函数,(3,个:同时设置,/,获取,2,个数据成员,其中设置器函数重载:无参的,(,值为,0,和,0),和有参的,),。,一个名为,distance,的函数,返回当前点和另一个给定的,MyPoint,类型的点之间的距离。,编写测试主函数,创建两个点,(0,0),和,(10,30.5),,并输出两点之间的距离。,34,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!