您好,欢迎访问三七文档
第八章类和对象【教学目的与要求】理解类的定义、对象的定义,掌握对象的使用方法,构造函数、析构函数和友元函数的定义和作用。【教学重点与难点】类的定义、对象的使用,构造函数、析构函数的调用顺序。【教学方法】讲授与上机相结合。8.1类的定义8.2构造函数8.3析构函数8.4友元函数和友元类【教学内容】两种程序设计方法:1、面向过程的程序设计:核心:是功能的分解。主要缺点:数据和应用在数据上的操作是分离的,忽略了二者之间的内在联系。2、面向对象的程序设计:观点:把程序看作是相互协作而又彼此独立的对象的集合,每个对象有自己的数据、操作和功能,把对象看作由数据及可以施加在这些数据上的操作所构成的统一体。特点:将数据和应用在数据上的操作封装在一起。优点:(1)程序的稳定性好,可维护性好,面向对象的程序易于阅读和理解。(2)对象可以重复使用,即重用性好。几个基本概念:1、类:是对具有共同属性和行为的一类事物的抽象。2、对象:一个具体的事物,是类的一个实例。对象的属性(静态特征):尺寸、形状、颜色、重量等。用数据成员来描述。对象的行为(动态特征):如球的膨胀、收缩,汽车的加速、刹车、转向等,用一组成员函数(操作、方法)来描述。类和对象之间是抽象和具体的关系。从程序设计的角度看:类是对象的模板,对象是类的实例。类在面向对象程序设计中扮演着极为重要的角色,可以毫不夸张的说,类设计的成功是整个设计成功的90%,在面向对象的设计中,一切都是围绕着类展开的,应当尽量使类小而简单,使它能够被一般的程序员所理解。在面向对象的程序中,对象之间需要进行交互。对象通过它对外提供的服务在系统中发挥自己的作用。8.1类的定义C++中的类就是一种用户定义的数据类型,和其它数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。8.1.1类的定义格式:基本格式:Class类名{成员表};定义格式举例:(1)structCA{inta;intb;}ax;(2)classCB{inta;intb;}bx;C++中定义类的一般格式如下:class类名{private:[私有数据成员和成员函数]protected:[保护数据成员和成员函数]public:[公有数据成员和成员函数]};其中:class:是类定义的关键字。类名:是用户命名的标识符。类中定义的数据和函数是类的成员,分别称为数据成员和成员函数,数据成员描述了对象的属性,而成员函数描述的是对象的行为。public:公有访问属性,成员可以为任意函数所使用。访问权限:用于规定类中成员的访问属性,是C++实现封装的基本手段。private:私有访问属性,成员只能为该类的成员函数和友元函数所使用protected:保护访问属性,成员只能为该类的成员函数和友元函数以及派生类的成员函数和友元函数所使用。类中成员的默认访问属性为private。一般情况下,类向外界提供的接口通常声明为public;类的数据成员通常声明为private;而要在派生类中使用的数据成员则声明为protected;1.创建对象类是一种数据类型,要想使用这种类型,必须声明对象,对象是类的实例。例:classCC{inta;//私有数据类名称public:voidInit(intaa)//公用成员函数{a=aa;}intGetData()//公用成员函数{returna;}}cx;对象名8.1.2定义格式举例例(p234):classCD{private:char*a;intb;public:voidInit(char*aa,intbb){a=newchar[strlen(aa)+1];strcpy(a,aa);b=bb;}char*Geta(){returna;}intGetb(){returnb;}voidOutput(){couta´´bendl;}}dx;//类Circle的定义constdoublepi=3.14159;classCircle{public:Circle(doublei=0,doublej=0,doubler=1):x(i),y(j){radius=r0?r:1;}doublearea()//返回圆的面积,成员函数在类内定义{returnpi*radius*radius;}doublegetRadius();//成员函数在类外定义private:doublex,y;doubleradius;};doubleCircle::getRadius(){returnradius;}#includeiostream.hvoidmain(){Circlec(1,1,10);cout半径为c.getRadius()的圆的面积为:c.area()endl;}Circle&cRef=c;//引用对象Circle*pCircle=&c;//对象指针CirclecArray[5];//对象数组8.1.3成员函数的定义1、成员函数的定义:(1)在类内定义(2)在类声明中,给出成员函数的原型,而成员函数在类外定义。这时,必须由作用域运算符“::”来通知编译系统该函数所属的类。成员函数用来描述类的动态行为。2、说明:(1)成员函数中可以使用默认形参。若成员函数的声明和定义是分开的,则参数的默认值只能在函数声明中给出。(2)成员函数可以定义为内联函数。若成员函数是在类中定义的,则隐含为内联的,无需使用inline关键字;若成员函数是在类外定义的,则使用inline关键字。一般只把简单的成员函数定义为内联函数。(3)每个类类型的大小,即由该类定义的对象所占用存储空间的字节数等于所有数据成员所占存储字节数的总和。每个类对象中只保留有数据成员的存储空间,不保留有成员函数的存储空间。1、在类范围内,可以直接访问类成员。2、在类范围外,可以通过对象名访问类的公有成员。访问方法:与结构变量成员的访问相同。cRef.getRadius()pCircle-area()8.1.4类成员的访问一个类的每个成员函数中都隐含有一个所属类的指针参数,其名字由系统规定为this(C++关键字)。当由一个对象调用一个成员函数时,除了把实参传送给成员函数中的形参外,同时还把该直接对象的地址或指针对象的值传送给成员函数中隐含说明的指针形参this,执行成员函数时对数据成员的访问实际上是对this指针所指对象中数据成员的访问,对成员函数的调用实际上是对this指针所指对象中成员函数的调用。3、this指针例8-1:用类来实现分数的定义和有关运算。(P237)4、类中的成员函数也允许函数重载和操作符重载注意:当定义重载双目操作符的成员函数时,则参数表中只需要定义一个参数,该参数是进行双目运算的第二个参数,而第一个参数为调用该函数的对象;当定义重载单目操作符的成员函数时,则参数表为空(除重载后缀加或减需要一个整型参数外),单目运算的参数为调用该函数的对象。在建立一个对象时,常常需要作某些初始化的工作(例如对数据赋初值),c++提供了一种特殊的成员函数-----构造函数。这种函数与其他成员不同,不需要用户发“消息”来激活它,而是在建立对象时自动执行。因此,构造函数是一种特殊的成员函数,具有重要的作用。作用:为对象分配存储空间,对数据成员进行初始化。8.2构造函数特点:1、构造函数的名字必须与类同名,没有返回类型和返回值。2、声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;3、构造函数可以重载,从而提供初始化类对象的不同方法。4、构造函数应定义为公有成员。5、如果程序员没有为类定义构造函数,系统会自动生成一个构造函数,但这种构造函数的函数体为空。形如:类名(){}因此,用于变量、对象的初始化的代码一般放在构造函数中。1).无参构造函数和带参构造函数下面通过具体例子来说明无参构造函数和带参构造函数的定义和使用。例:建立一个对象,输出学生的学号、姓名和性别。#includestring.h#includeiostream.hVoidmain()//主函数开始{classstud//类定义开始voiddisplay(){private:{cout“num”num;intnum;cout“name”name;charname[10];cout“sex”sexendl;charsex;}public:};//类定义结束stud()//定义构造函数无形参studstud1;//自动执行构造函数{num=10010;stud1.display();strcpy(name,”wang”);}//mainsex=‘F’;}注:带参构造函数在定义类的对象时,将实参传回构造函数stud(intn,charxm[],chars){num=n;strcpy(name,xm);sex=s;}studstud1(10010,”wang”,’M’)补充:构造函数中的初始化表在构造函数中给数据成员赋值时,可以采用两种格式:初始化表与形参表之间必须用冒号分开,初始化表中用逗号分开的每一项用于给一个成员变量赋值,每一项的格式为:成员变量名(初值表达式)。例如;Array():a(NULL),n(0){…}当带有初始化表的构造函数执行时,首先执行初始化表,然后才执行函数体。在执行初始化表时,不管各项的排列次序如何,都将按照类中数据成员定义的先后次序给数据成员赋初值。1、在函数体中使用赋值语句把表达式的值赋给成员变量。2、在形参表后和函数体之前使用初始化表(初值表)赋值。例:写出下列程序的运行结果。#includeiostream.hclassA{inta,b;public:A(intaa=0,intbb=0):a(aa),b(bb){couttheresultisa+bendl;}};voidmain(){Ax,y(2,3);}2).拷贝构造函数(复制构造函数)当类中的构造函数有且只有一个形参是所属类的对象的引用时,则称此构造函数为拷贝构造函数或复制构造函数。是一种特殊的构造函数。函数原型:类名(类名&);//必须使用引用参数作用:通过建立已有类对象的副本来初始化新的对象。不论何时需要复制对象时,都会调用拷贝构造函数。对于任何类,如果程序员没有定义拷贝构造函数,则系统自动生成一个拷贝构造函数,这种拷贝构造函数在执行时,只是进行简单的成员复制。析构函数也是一种特殊的成员函数,具有重要的作用。作用:在系统收回对象的内存之前对每个类对象进行清理工作,使内存可以复用于保存新对象。特点:1、析构函数的名字由“~”和类名组成,没有任何参数,也不返回任何值。2、撤消类对象时,系统自动调用析构函数。3、析构函数应定义为公有成员。4、如果程序员没有为类定义析构函数,系统会自动生成一个析构函数,但这种析构函数的函数体为空,不执行任何操作。形如:~类名(){}通常利用析构函数删除对象中指针成员所指向的动态分配的存储空间,当类中没有指针成员时,则不需要定义析构函数。8.3析构函数ClassArray{int*a;//定义数组指针,用以指向一个动态数组intn;public:Array(intaa[],intlen)//构造函数{n=len;a=newint[n];for(inti=0;in;i++)a[i]=aa[i];}~Array()//析构函数{delete[]a;cout“destructor”endl;}};8.4友元函数和友元类类的重要特性是对数据实现了封装和隐藏,在类中定义的私有成员和保护成员只能通过类的公有成员函数来访问。这样能大大提高程序的质量,特别是能够提高软件的可维护性。但是在某些情况下,封装也会带来一些不便。如果在程序中为了访问对象的私有数据成员而频繁调用公有成员函数时,将会带来较大开销,从而降低程序的执行效率,影响程序的性能。为此,C++中引入了友元机制,利用这种机制,一个类可以赋予某些函数或类访问它的私有成员的特权,这样的函数或类称为该类的友元函数或友元类。友元函数和
本文标题:c++类和对象
链接地址:https://www.777doc.com/doc-3747347 .html