一章类与对象.ppt
《一章类与对象.ppt》由会员分享,可在线阅读,更多相关《一章类与对象.ppt(81页珍藏版)》请在三一办公上搜索。
1、C+语言程序设计,工程技术学院电计系 蒋志平,二0一二年三月,第3章 类与对象,本章主要介绍类与对象。类(class)是面向对象程序设计的核心,是实现数据封装和信息隐藏的工具,是继承和多态的基础。本章是全书的基础与重点,也是学习面向对象程序设计技术的基础。,3.1 结构与类,1、C对C结构的扩展最初的C+称为“带类的C”,它扩展了C语言结构的功能,结构不仅可以包含数据,而且还可以包含操作这些数据的函数。【例3-1】一个包含了数据和数据操作函数的复数结构。/Eg3-1.cppstruct Complexdouble r;double i;void init(double rr,double ii
2、)r=rr;i=ii;double real()return r;double image()return i;,1、引入类的原因解除struct的不安全性(struct成员的默认访问权限是public)区别于struct2、类的定义形式class 类名public:公有成员说明;protected:保护成员说明;private:私有成员说明;;,3.1.3 class,【例3-2】用class定义的复数类Complex。/Eg3-2.cpp#include class Complexprivate:double r;double i;public:void init(double rr,do
3、uble ii)r=rr;i=ii;double real()return r;double image()return i;,3.1.3 class,void main()Complex a;a.init(2,3);couta.real()+“a.image()i“endl;a.r=6;/错误,a.i=3.2;/错误,4、关于class的说明 类声明中的访问限定符private、public、protected没有先后次序之分 在一个类中,访问限定符private、public、protected的出现次数没有限制 数据成员和成员函数都可以设置为public、private或protecte
4、d属性。出于信息隐藏的目的,常将数据成员设置为private权限,将需要让类的外部函数(非本类定义的函数)访问的成员函数设置为public权限。,3.1.3 class,数据成员可以是任何数据类型,如整型、浮点型、字符型、数组、指针、引用等,也可以是另外一个类的对象或指向对象的指针,还可以是指向自身类的指针或引用,但不能是自身类的对象。例如:class A;class Bprivate:int a;A obja1;/正确A*obja2;/正确B*objb,3.1.3 class,在声明(或定义)类时,不能为数据成员赋初值。例如:class Aprivate:int a=0;/错误int b3=
5、1,2,3;/错误public:;,3.1.3 class,类和结构的区别类定义种默认情况下的成员是private;结构定义种默认情况下的成员是public;,struct complexdouble real;double image;public:double realcomplex();double imagecomplex();double abscomplex();,class complexdouble real;double image;public:double realcomplex();double imagecomplex();double abscomplex();,p
6、ublic,private,3.1.3 class,1、成员函数(方法)的定义(1)在类声明中定义(内置函数)(2)在类声明以外定义返回类型 类名:成员函数名称(参数表)函数体,3.2 成员函数,2、定义成员函数的案例class Dateint day,month,year;public:void init(int,int,int);int getDay();int getYear()return year;int Date:getDay()return day;void Date:init(int d,int m,int y)day=d;month=m;year=y;,3.2 成员函数,3、
7、常量成员函数在C+中,为了禁止成员函数修改数据成员的值,可以将它设置为常量成员函数。形式如下:class x T f()const;,3.2 成员函数,常量成员函数举例class Employee char*name;double salary;public:void init(const char*Name,const double y);double getSalary()const;/常量函数,不能通过它修改name和salary;说明:只有类的成员函数才能定义为常量函数,普通函数不能定义为常量函数。,3.2 成员函数,3.3 类与封装,案例:clock类的封装,3.3 类与封装,封装的
8、意义封装使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。用private把不想让其他程序访问的数据或函数设置为私有成员,就可以禁止其他程序对这些数据的随意修改;用public设置一些公有成员,让本类之外的其他函数能够通过这些公有成员,按照类允许的方法访问类的私有数据,就能够实现数据保护的目的,一般C+类的文件组织形式一个类组织在两个文件中文件名与类名相同类的声明文件以.hpp或.h为后缀类成员函数的定义常放在与类同名的.cpp文件中比如:Complex.hComplex.cpp引用其他类用#include指令包含类的声明比如:#include“complex.h”,3.3 类与封装
9、,student.cpp,Program.exe,student.obj,student.h,Other1.cpp,Other1.obj,Other2.cpp,Other2.obj,#include,compile,link,5、应用C+类的文件组织形式,3.3 类与封装,1、对象与类的关系类和对象class:数据类型object:类型的实例类型和实例typeinstance,3.4 对象,2、对象的定义类名 对象1,对象2;例如:Clock myClock,yourClock;,3.4 对象,3、对象的引用对象名.数据成员名对象名.成员函数名(实参表)myClock.setHour(12);
10、myClock.dispTime();Clock*pClock;pClock=new Clock;pClock-setHour(10);pClock-dispTime();,3.4 对象,4、对象赋值对象名1对象名2;Clock*pa,*pb,aClock,bClock;bClock=aClock;pa=new Clock;pb=pa;,1、两个对象必须类型相同2、进行数据成员的值拷贝,赋值之后,两不相干3、若对象有指针数据成员,赋值可能产生问题,3.4 对象,3.5 构造函数与析构函数,构造函数与析构函数是两个极其特殊的函数,它们由系统自动执行,在程序中不可显示地调用它们。理解这两个函数对学
11、好面向对象程序设计技术是大有帮助的。构造函数的主要作用是用于建立对象时对对象的数据成员进行初始化;而析构函数主要用于对象生命期结束时回收对象。,3.5.1 构造函数,1、构造函数的概念构造函数(constructor)是与类同名的特殊成员函数,主要用来初始化对象的数据成员。其在类中的定义形式如下:class X X();,3.5.1 构造函数,2、构造函数的特点构造函数与类同名。构造函数没有返回类型。构造函数可以被重载。构造函数由系统自动调用,不允许在程序中显式调用。引用构造函数的原因自动完成数据成员初始化,减少出错几率,3、构造函数的调用只能在定义对象时,由系统自动调用!调用形式:类名 对象
12、名(参数表);系统将根据参数表调用某个构造函数若无参数表将调用缺省构造函数。不允许程序员在程序中显示调用构造函数的名称,任何时候都不允许!,3.5.1 构造函数,3.5.1 构造函数,【例3-4】一个桌子类的构造函数。/Eg3-4.cpp#include using namespace std;class Deskpublic:Desk(int,int,int,int);/构造函数声明 void setWeight(int w)weight=w;private:int weight,length,width,high;Desk:Desk(int ww,int l,int w,int h)/构造
13、函数定义 weight=ww;high=l;width=w;length=h;coutcall constructor!endl;void main()Desk d1(2,3,3,5);,3.5.1 构造函数,4、使用构函数函数应注意的问题 构造函数不能有返回类型,即使void也不行。构造函数由系统自动调用,不能在程序中显式调用构造函数。构造函数的调用时机是定义对象之后的第一时间,即构造函数是对象的第一个被调用函数。定义对象数组或用new创建动态对象时,也要调用构造函数。但定义数组对象时,必须有不需要参数的构造函数 构造函数通常应定义为公有成员。,1、析构函数的概念析构函数(destructo
14、r)是与类同名的另一个特殊成员函数,作用与构造函数相反,用于在对象生存期结束时,完成对象的清理工作。2、定义语法class XX();3、析构函数特点函数名为加类名无参数无返回值不能重载:每个类仅有一个析构函数,3.5.2 析构函数,4、析构函数调用时机对象生命期结束时自动调用自动/局部对象:定义的语句块结束处全局对象:程序结束时静态对象:程序结束时,3.5.2 析构函数,【例3-5】析构函数和构造函数的应用。/Eg3-5.cpp#include using namespace std;class Aprivate:int i;public:A(int x)i=x;coutconstructo
15、r:iendl;A()coutdestructor:iendl;void main()A a1(1);A a2(2);A a3(3);A a4(4);,3.5.2 析构函数,5、使用析构说明 若有多个对象同时结束生存期,C+将按照与调用构造函数相反的次序调用析构函数。每个类都应该有一个析构函数,如果没有显式定义析构函数。C+将产生一个最小化的默认析构函数。构造函数和析构函数都可以是inline函数 在通常情况下,析构函数与构造函数都应该被设置为类的公有成员。,3.5.2 析构函数,3.5.2 析构函数,【例3-6】用析构函数释放构造函数分配的自由存储空间。#include using name
16、space std;class Bprivate:int*a;char*pc;public:B(int x)a=new int10;pc=new char;B()delete a;delete pc;void main()B x(1);,3.5.2 无参构造函数,无参数构造函数指在定义对象时,不需要提供参数的构造函数。在一些情况下,如定义数组,必须使用无参构造函数,因此需要引起重视。,3.5.2 无参构造函数,1、系统默认构造函数C+规定,每个类必须有构造函数,如果一个类没有定义任何构造函数,在需要时编译器将会为它生成一个默认构造函数。class X X()/系统默认构造函数类似于此 在用默认
17、构造函数创建对象时,如果创建的是全局对象或静态对象,则对象所有数据成员初始化为0;如果创建的是局部对象,即不进行对象数据成员的初始化。,3.5.2 无参构造函数,【例3-7】point类的默认构造函数。/Eg3-7.cpp#include using namespace std;class pointprivate:int x,y;public:void setpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;point p1;/定义全局对象void main()static point p2;/定义静态局部对象 p
18、oint p3;/定义局部对象 coutp1:p1.getx(),p1.gety()endl;coutp2:p2.getx(),p2.gety()endl;coutp3:p3.getx(),p3.gety()endl;,说明:在类没有定义任何构造函数时,系统才会产生默认构造函数。一旦定义了任何形式的构造函数,系统就不再产生默认构造函数。【例3-8】未定义无参构造函数引发的错误。#include using namespace std;class pointprivate:int x,y;public:point(int a,int b)x=a;y=b;/;point p1;void main(
19、)static point p2;point p3,*p4,a10;p4=new point;,2、重定义无参数构造函数系统生成的默认无参数构造函数,并未对对象的数据成员作什么实际的初始化工作。C+允许显式定义无参数的构造函数,这样就能通过它为对象的数据成员提供初始值。有时为了让类能够正常工作,必须显示提供无参构造函数,如例3-8。,3.5.2 无参构造函数,注意在class没有定义任何构造函数时,系统可能动会产生缺省无参构造函数。一旦定义了任意的构造函数。系统就不会产生缺省的无参构造函数,3.5.2 无参构造函数,【例3-9】定义Point类的无参数构造函数,将point对象的数据成员初始化
20、为0。#include using namespace std;class pointprivate:int x,y;public:point(int a,int b)x=a;y=b;int getx()return x;int gety()return y;point()x=0;y=0;/显式定义无参构造函数;point p1(1,1);/调用构造函数point(int,int)void main()static point p2;/调用构造函数point()point p3,a10;/调用构造函数point()point*p4;p4=new point;/调用构造函数point()cout
21、getx()gety()endl;,3.5.2 定义缺省参数构造函数,在数据成员的取值比较固定时,可以通过为构造函数参数提供缺省参数初始化它们。【例3-10】定义point类的缺省参数构造函数。/Eg3-10.cpp#include using namespace std;class pointprivate:int x,y;public:point(int a=0,int b=0)x=a;y=b;/缺省参数构造函数 int getx()return x;int gety()return y;,构造函数可以重载。与普通函数的重载一样,重载的构造函数必须具有不同的函数原型【例3-12】有一日期类
22、,重载其构造函数。class Tdatepublic:Tdate();Tdate(int d);Tdate(int m,int d);Tdate(int m,int d,int y);/其他公共成员protected:int month;int day;int year;,3.5.3 重载构造函数,Tdate:Tdate()month=4;day=15;year=1995;cout month/day/year endl;Tdate:Tdate(int d)month=4;day=d;year=1996;cout month/day/year endl;Tdate:Tdate(int m,in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一章类 对象
链接地址:https://www.31ppt.com/p-4873510.html