资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,类和对象,第7章 类与对象(一),面向对象的基本概念,类的定义,创建对象,构造函数与析构函数,对象数组,this,指针,静态成员,友元,类的作用域,11/27/2024,1,类和对象,面向对象的基本概念,*1.面向对象与面向过程的区别:,我要开车去新疆,面向过程,我开车,我过陕西,我过兰州,面向对象,我命令车去新疆,车怎么去我不关心(封装),11/27/2024,2,类和对象,2.类(,class),和对象(,object),的概念,对象是系统中用来描述客观事务的一个实体,它通过“属性,attribute,(,数据成员)”和“,行为,behavior,(,成员函数、方法)”来分别实体的静态属性和动态属性。,类是具有共同属性和行为的对象的抽象。对象是类的实例(,instance)。,学生,A,抽象,类,对象,学生,学号,姓名,学习(),学生,A,学号=,101,姓名=,TOM,实例化,11/27/2024,3,类和对象,*3.类(对象)之间的关系,关联关系,教师,姓名,教学(学生,A),学生,学号,姓名,学习(),学校,11/27/2024,4,类和对象,继承关系(一般和特殊),xx,是一种,XX,类的继承层次,11/27/2024,5,类和对象,聚合关系(整体和部分),队长,队员,球队,聚集,头,身体,人,组合,11/27/2024,6,类和对象,多态,车,go(),大卡车,go(),小汽车,go(),11/27/2024,7,类和对象,面向对象的设计思想,有那些类(对象)?,每一种类(对象)有哪些属性和方法?,类(对象)之间有哪些关系?,11/27/2024,8,类和对象,类的定义,类的定义格式一般分为,说明部分,和,实现部分,。,说明部分:是用来,说明,类中的成员,包含,数据成员,的说明和,成员函数,的说明。成员函数是用来对数据成员进行操作的,也称为“,方法,”。,实现部分:是用来对成员函数进行,定义,。,11/27/2024,9,类和对象,说明部分,的一般格式,class,类类型名,public:,公有成员说明,private:,私有成员说明,;,私有访问权限,为默认值,可缺省,公有访问权限,除本类中的成员函数及友元外,其他类外函数不能访问。,程序中的任何函数都可访问,11/27/2024,10,类和对象,例如:定义一个,Person,类,设,Person,具有的特征:属性(姓名、年龄、性别),方法(输出一个人的属性);则对应着有4个成员:,三个数据成员,,,一个成员函数,。三个数据成员定义为,私有成员,,,print,成员函数定义为,公有成员,。则有:,class CPerson,public:,void print();,private:,char name10;,int,age;,char sex;,;,类名通常用,C,字母开始,以区别其他标识符,11/27/2024,11,类和对象,类的,实现部分,类的实现部分,即定义它的成员函数,如在类说明内部定义,则方式与定义普通函数大体相同。,若在类说明外部定义成员函数,则应使用,类域运算符,:,(,p21),指明该函数是哪个类中的成员函数。,格式为:,函数类型,类名:,成员函数名(形参表)函数体;,void CPerson:print(),cout,nameagesex,endl,;,除特殊指明外,成员函数操作的是,同一对象,中的数据成员。,不同的类允许有,相同名称的成员函数,,因此,在类外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用域操作符,“,:,”,。,11/27/2024,12,类和对象,当成员函数的规模较小时,可,在类中定义成员函数,,,成为内联成员函数,。例:,class CDate,public:,void setDate(,int,m,int,d,int,y)/,置日期值,month=m;,day=d;,year=y;,void print();,private:,int,month,day,year;,;,void,CDate:print(),cout,year.month.day数据成员,或,指针名-成员函数,(*指针名).数据成员,或,(*指针名).成员函数,例:,pDate,-day=30;,pDate,-Print();,(*,pDate,).day=30;(*,pDate,).Print();,用引用访问对象成员:,引用,名.数据成员,或,引用,名.成员函数,例:,rDate.year=2008;rDate.Print();,11/27/2024,16,类和对象,注意:,在成员函数中访问成员无须加对象名来作为前缀。,如:,void,CDate,:print(),cout,year.month.day,endl,;,在,year,等成员之前不能加对象名,,在定义类时,成员函数是所有对象共享的代码,不被某一个对象独占,。也无法确定类的对象名。,注 意,11/27/2024,17,类和对象,例,一个完整的程序,/,CDate,.h,class,CDate,public:,void setDate(,int,m,int,d,int,y)/,置日期值,month=m;,day=d;,year=y;,void print();,private:,int,month,day,year;,;,void,CDate,:print(),cout,year.month.day,endl,;,11/27/2024,18,类和对象,续例,一个完整的程序,#,include ,#include ,CDate,.h,void main(),CDate date1,;,date1,.setDate(8,5,1996);,date1,.print();,/,cout,date1,.yearprint();*/,testClass,testCDate,.,cpp,11/27/2024,19,类和对象,类的,成员函数,内联函数:指定义在类体内的成员函数。,外联函数:,指说明在类体内,定义在类体外的成员函数。,类外定义的函数,缺省,情况下都是外联函数,用关键字,inline,可以强制转换。,对于内联成员函数,编译时在所有调用该函数的地方将,装入实际的函数代码。,1.内联函数和外联函数,11/27/2024,20,类和对象,class,CDate,public:,void setDate(,int,m,int,d,int,y)/,内联函数之一,month=m;,day=d;,year=y;,void print();,private:,int,month,day,year;,;,inline,void,CDate,:print()/,内联函数之二,cout,year.month.day,endl,;,11/27/2024,21,类和对象,2.,设置参数的缺省值,函数在定义时可以预先定义出形参的缺省值。调用时如果给出实参,则用实参初始化形参,如果没有给出实参,则采用预先定义形参的缺省值。,例如:,void setDate(,int,m,int,d28,int,y2008);,/,缺省参数按,从右往左,的方式,或,void setDate(,int,m,int,d28,int,y2008),在进行函数调用时,主调函数的实参与被调函数的形参按,从左到右,的位置结合。,TestParaDefault.,cpp,11/27/2024,22,类和对象,3.,函数的重载,函数的重载:出现在相同作用域的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(,overloaded function)。,调用时,会根据不同的参数表选择对应的成员函数。,重载函数,必须,:函数名相同,函数的作用域相同,函数的参数个数或参数类型不同。,使用重载函数时应注意:,只有返回值不同,不能成为重载函数。,int,max(,int,a,int,b);,double max(,int,a,int,b);,/,错误,使用带缺省值的函数时,可能引发错误。如:,int,max(,int,a,int,b=0);,int,max(,int,c);,当用一个实参调用该函数时,如,max(2),,则会出现调用歧义性,11/27/2024,23,类和对象,构造函数和析构函数,构造函数和析构函数都是类的成员函数,是特殊的成员函数,不能被调用而由系统自动调用/执行。,构造函数名与类名相同;析构函数名为类名前加,“,”,。,构造函数,的功能是在创建对象时给对象,分配,内存空间,并可使用给定值来,初始化,对象。,析构函数,的功能是用来,释放,一个对象的已分配空间。并可在对象被清除前,完成一些,清理,工作。,11/27/2024,24,类和对象,对前面的日期类进行修改,并将定义存放在,CDate1.h,文件中。,如:,class,CDate1,public:,CDate1(,int,y,int,m,int,d);,CDate1();,void print();,private:,int,year,month,day;,;,函数名与类名一致,无类型但可有参数,名字与类名一致,前有,无类型无参数,11/27/2024,25,类和对象,CDate1:CDate1(,int,m,int,d,int,y),month=m;,day=d;,year=y;,cout,Constructor called.n;,CDate1:CDate1(),cout,Destructor called.n;,void CDate1:print(),cout,year.month.day,endl,;,与其他成员函数定义一样,两种函数的定义可放在类体内,也可放在类体外,11/27/2024,26,类和对象,#,include,#include CDate1.h,void main(),CDate1 today(2007,4,1),tomorrow(,2007,4,2,);,cout,today is;,today.print();,cout,tomorrow is;,tomorrow.print();,执行程序后,输出结果为:,函数结束时,自动调用析构,Constructor Called.,Constructor Called.,today is 2007,.,4,.,1,tomorrow is,2007.4.2,Destructor called.,Destructor called.,11/27/2024,27,类和对象,构造函数,的,特点,有:,程序中一般不直接调用构造函数,在创建对象时,系统自动调用,构造函数。,构造函数,可以重载,,即可定义多个参数个数不同的函数,构造函数有,隐含的返回值,,并由系统内部使用,析构函数,的,特点,有:,一个类中只能定义一个析构函数,即,不能重载,析构函数可以被调用,也可系统调用,被自动调用的情况有两种:,在一个函数体内定义的一个对象,当,函数结束,时,用,new,运算符动态创建的一个对象,在,使用,delete,释放,时,11/27/2024,28,类和对象,缺省构造函数和缺省析构函数,在类定义中可以不定义任何构造函数,这时编译器会自动生成一个不带参数的缺省构造函数。,其格式为:,:(),则,在程序中定义一个对象而未指明初始化时,,编译器便按缺省构造函数来初始化该对象。,若定义了构造函数,则编译器就不会再生成缺省构造函数,必须使用定义的构造函数创建对象。,同理,,若一个类中未定义析构函数,编译系统也生成一个缺省析构函数。,其格式为:,:(),这也是前面的程序中可以没有构造和析构函数的原因,11/27/2024,29,类和对象,class,CConstruct,public:,CConstruct,(,int,x,int,y);,CConstruct,();,void print();,private:,int,
展开阅读全文