《c讲稿Chapter3关于类和对象的进一步讨论44189.pptx》由会员分享,可在线阅读,更多相关《c讲稿Chapter3关于类和对象的进一步讨论44189.pptx(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、回顾回顾第第2章章类和对象类和对象q对象、对象的两个要素对象、对象的两个要素q类类q面向对象程序设计的三大特性面向对象程序设计的三大特性q类的定义类的定义q对象的定义与使用对象的定义与使用1第第3章章关于类和对象的进一步讨论关于类和对象的进一步讨论本章内容本章内容p3.1构造函数构造函数p3.2析构函数析构函数p3.3调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序p3.4对象数组对象数组p3.5对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放3本章内容本章内容q3.8对象的赋值和复制对象的赋值和复制q3.9静态成员静态成员q3.10
2、友员友员q3.11函数模板与类模板函数模板与类模板4目标目标q理解构造函数与析构函数的作用;理解构造函数与析构函数的作用;q熟练掌握构造函数和析构函数的定义和使用。熟练掌握构造函数和析构函数的定义和使用。q掌握对象数组、对象指针的使用,以及对象的动掌握对象数组、对象指针的使用,以及对象的动态建立与释放;态建立与释放;q了解对象的赋值与复制了解对象的赋值与复制q理解静态成员和友元的作用理解静态成员和友元的作用q熟练掌握静态成员和友元的定义与使用熟练掌握静态成员和友元的定义与使用q了解函数模板与类模板的定义与使用了解函数模板与类模板的定义与使用5本章内容本章内容p3.1 构造函数构造函数p3.2析
3、构函数析构函数p3.3调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序p3.4对象数组对象数组p3.5对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放63.1构造函数构造函数3.1.1对象的初始化对象的初始化定义对象时最好能给对象的数据成员进行初始化,定义对象时最好能给对象的数据成员进行初始化,但但不能不能在类的声明中进行。在类的声明中进行。例如:例如:classTimeprivate:inth=0;/错误!错误!;类是个抽象的自定义数据类型,不占存类是个抽象的自定义数据类型,不占存储空间,无法存储数据储空间,无法存储数据73.1构造
4、函数构造函数3.1.2构造函数的作用构造函数的作用q构造函数是类中一种特殊的构造函数是类中一种特殊的成员函数成员函数。q构造函数的作用是在系统创建对象时,给对象的构造函数的作用是在系统创建对象时,给对象的数据成员进行初始化。数据成员进行初始化。q格式:格式:类名类名(参数表参数表)函数体;函数体;注意类注意类外定义外定义的格式的格式83.1构造函数构造函数3.1.2构造函数的作用构造函数的作用构造函数的特点构造函数的特点1 1、构造函数名字必须与类名相同,不具有任何类型,、构造函数名字必须与类名相同,不具有任何类型,也不返回任何值。也不返回任何值。2 2、构造函数的权限必须是、构造函数的权限必
5、须是publicpublic。3 3、构造函数不需要也不能被用户调用,而是在建立、构造函数不需要也不能被用户调用,而是在建立对象时由系统自动调用执行。对象时由系统自动调用执行。4 4、每个类都、每个类都必须必须有一个构造函数,用户没有定义时,有一个构造函数,用户没有定义时,系统会系统会自动生成自动生成一个空的构造函数。一个空的构造函数。93.1构造函数构造函数3.1.3无参和带参的构造函数无参和带参的构造函数(一)无参数的构造函数(一)无参数的构造函数(默认默认构造函数)构造函数)格式:格式:类名()类名()数据成员初始值;数据成员初始值;对象的定义格式:对象的定义格式:类名类名对象名;对象名
6、;103.1构造函数构造函数3.1.3无参和带参的构造函数无参和带参的构造函数(二)带参数的构造函数(二)带参数的构造函数类名(类型类名(类型1参数参数1,类型,类型2参数参数2,)数据成员数据成员1参数参数1;数据成员数据成员2参数参数2;对象的定义格式为:对象的定义格式为:类名类名对象名(实参对象名(实参1,实参,实参2,););113.1构造函数构造函数3.1.4用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化q参数初始化表参数初始化表对数据成员的初始化放在函数首对数据成员的初始化放在函数首部实现。部实现。q格式:格式:类名(类型类名(类型1参数参数1,类型类型2参数参数2,
7、):数数据成员据成员1(参数(参数1),数据成员),数据成员2(参数(参数2),q对象的定义格式为:对象的定义格式为:类名类名对象名(实参对象名(实参1,实参,实参2,););123.1构造函数构造函数3.1.5构造函数的构造函数的重载重载定义定义 在一个类中可以定义多个构造函数,其参数在一个类中可以定义多个构造函数,其参数的个数、顺序或类型不相同。的个数、顺序或类型不相同。q调用调用 建立对象时,系统将根据对象的实参个数、建立对象时,系统将根据对象的实参个数、类型去匹配对应的构造函数。类型去匹配对应的构造函数。133.1构造函数构造函数3.1.6带默认参数的构造函数带默认参数的构造函数格式:
8、格式:类名(类型类名(类型1参数参数1默认值默认值1,类型,类型2参数参数2默认值默认值2,)数据成员数据成员1参数参数1;数据成员数据成员2参数参数2;14构造函数补充说明构造函数补充说明q在调用构造函数时,不必给出实参的构造函数,在调用构造函数时,不必给出实参的构造函数,称之为称之为默认构造函数默认构造函数q全部参数都指定了默认值的构造函数也属于默认全部参数都指定了默认值的构造函数也属于默认构造函数构造函数q一个类一个类只能有一个只能有一个默认构造函数默认构造函数q定义了全部是默认参数的构造函数后,不能在定定义了全部是默认参数的构造函数后,不能在定义重载构造函数义重载构造函数q如果定义了任
9、何其他的构造函数,编译器就不会如果定义了任何其他的构造函数,编译器就不会为你自动生成缺省的构造函数为你自动生成缺省的构造函数153.2析构函数析构函数(一)析构函数的作用(一)析构函数的作用析构函数的作用是在系统撤销对象占用的内存之析构函数的作用是在系统撤销对象占用的内存之前,完成一些清理工作。前,完成一些清理工作。格式格式 类名()类名()函数体;函数体;163.2析构函数析构函数(二)析构函数的特点(二)析构函数的特点q1 1、析构函数名是在类名前加、析构函数名是在类名前加“”,无返回类型,无返回类型,无参数。无参数。q2 2、析构函数无参数,故不能被重载。、析构函数无参数,故不能被重载。
10、q3 3、当系统撤销对象之前将调用析构函数。、当系统撤销对象之前将调用析构函数。P78P78q注意:注意:析构函数也析构函数也可可被用户当普通函数进行调用,被用户当普通函数进行调用,但不影响系统在撤销对象时的自动调用。但不影响系统在撤销对象时的自动调用。17classStudentprivate:char*pName;public:Student()pName=newchar20;Student()deletepName;18类和对象类和对象类类数据成员数据成员成员函数成员函数对对象象数据成员数据成员数据成员数据成员对对象象19q小结小结q构造函数构造函数q构造函数的作用构造函数的作用q构造函
11、数的特点构造函数的特点q无参和带参的构造函数无参和带参的构造函数q用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化q构造函数的重载构造函数的重载q带默认参数的构造函数带默认参数的构造函数q析构函数析构函数q析构函数的作用析构函数的作用q析构函数的特点析构函数的特点20本章内容本章内容p3.1构造函数构造函数p3.2析构函数析构函数p3.3构造函数和析构函数的调用顺序构造函数和析构函数的调用顺序p3.4对象数组对象数组p3.5对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放213.4对象数组对象数组对象数组对象数组指由同类的多个指由
12、同类的多个对象对象构成的集合。构成的集合。(一)对象数组定义格式:(一)对象数组定义格式:类名类名 对象数组名对象数组名 常量表达式常量表达式;类名类名 对象数组名对象数组名 常量表达式常量表达式11常量表达式常量表达式2 2;223.4对象数组对象数组对象数组对象数组(二)对象数组的初始化格式(二)对象数组的初始化格式类名类名 对象数组名对象数组名 常量表达式常量表达式 类名类名(实参列表(实参列表1 1),),类名类名(实参列表(实参列表2 2),),;233.4对象数组对象数组对象数组对象数组(三)数组元素的存取格式:(三)数组元素的存取格式:对象数组名对象数组名 下标下标.数据成员数据
13、成员对象数组名对象数组名 下标下标.成员函数成员函数24本章内容本章内容p3.1构造函数构造函数p3.2析构函数析构函数p3.3对象的赋值和复制对象的赋值和复制p3.4对象数组对象数组p3.5 对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放253.5对象指针对象指针q3.5.1指向对象的指针指向对象的指针q3.5.2指向对象成员的指针指向对象成员的指针q3.5.3this指针指针263.5对象指针对象指针3.5.1指向对象的指针指向对象的指针定义格式:定义格式:类名类名*对象指针名对象指针名访问格式:访问格式:对象指针对象指针 数据成员数据
14、成员对象指针对象指针 成员函数(实参列表)成员函数(实参列表)273.5对象指针对象指针3.5.1指向对象的指针指向对象的指针例如:例如:Timet1(10,30,30);t1.ShowTime();Time*p;p=&t1;p-SetTime(8,0,0);t1.ShowTime();283.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(一)指向对象数据成员的指针(一)指向对象数据成员的指针定义格式:定义格式:类型类型*指针变量名指针变量名访问格式:访问格式:指针变量名指针变量名&对象对象.成员名;成员名;注意:注意:所指向的数据成员必须为所指向的数据成员必须为publi
15、c。293.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(一)指向对象数据成员的指针(一)指向对象数据成员的指针定义格式:定义格式:类型类型*指针变量名指针变量名访问格式:访问格式:指针变量名指针变量名&对象对象.成员名;成员名;例如:例如:Timet1(10,30,30);int*p;p=&t1.h;/若若h为为public成员成员303.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(二)指向对象成员函数的指针(二)指向对象成员函数的指针1、指向普通函数的指针、指向普通函数的指针函数在编译时被分配到一个入口地址,称为函数函数在编译时被分配到一个入口地址
16、,称为函数的指针。的指针。函数名代表该函数的入口地址。函数名代表该函数的入口地址。313.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(二)指向对象成员函数的指针(二)指向对象成员函数的指针1、指向普通函数的指针、指向普通函数的指针定义形式:定义形式:返回类型返回类型(*指针变量名指针变量名)(形参列表)(形参列表)赋值形式:赋值形式:指针变量名函数名指针变量名函数名323.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(二)指向对象成员函数的指针(二)指向对象成员函数的指针1、指向普通函数的指针、指向普通函数的指针函数调用形式:函数调用形式:函数名(实参
17、)函数名(实参)(*指针变量名指针变量名)(实参列表)(实参列表)q举例:举例:sumsum函数函数333.5对象指针对象指针3.5.2指向对象成员的指针指向对象成员的指针(二)指向对象成员函数的指针(二)指向对象成员函数的指针2、指向对象成员函数的指针、指向对象成员函数的指针举例:时间类举例:时间类Time34#includeusingnamespacestd;classTimeinth,m,s;public:Time(inthh=0,intmm=0,intss=0)h=hh;m=mm;s=ss;voidShowTime()couth:m:sh=h;this-m=m;this-s=s;voi
18、dShowTime()couth:m:sendl;40本章内容本章内容p3.1构造函数构造函数p3.2析构函数析构函数p3.3对象的赋值和复制对象的赋值和复制p3.4对象数组对象数组p3.5对象指针对象指针p3.6 共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放413.6共用数据的保护共用数据的保护q3.6.1常对象常对象q3.6.2常对象成员常对象成员q3.6.3指向对象的常指针指向对象的常指针q3.6.4指向常对象的指针变量指向常对象的指针变量q3.6.5对象的常引用对象的常引用42本章内容本章内容p3.1构造函数构造函数p3.2析构函数析构函数p3.3析构函
19、数和构造函数的调用顺序析构函数和构造函数的调用顺序p3.4对象数组对象数组p3.5对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7 对象的动态建立和释放对象的动态建立和释放433.7对象的动态建立与释放对象的动态建立与释放3.7对象的动态建立与释放对象的动态建立与释放动态创建和撤销一个对象动态创建和撤销一个对象指针名指针名new类名(初值)类名(初值);delete指针名;指针名;注意注意1 1、使用、使用newnew创建对象时自动调用构造函数,创建对象时自动调用构造函数,deletedelete撤销对象之前自动调用析构函数;撤销对象之前自动调用析构函数;2 2、动态创建的对象必须
20、使用、动态创建的对象必须使用deletedelete进行撤销。进行撤销。443.7对象的动态建立与释放对象的动态建立与释放3.7对象的动态建立与释放对象的动态建立与释放动态创建和撤销一维对象数组动态创建和撤销一维对象数组对象指针对象指针new类名类名数组大小数组大小;delete对象指针;对象指针;注意注意1 1、构造函数和析构函数的调用次数与数组的大小、构造函数和析构函数的调用次数与数组的大小相同。相同。2 2、此时只能调用默认构造函数,不能给参数、此时只能调用默认构造函数,不能给参数3 3、注意构造函数和析构函数的调用顺序。、注意构造函数和析构函数的调用顺序。45本章内容本章内容p3.1构
21、造函数构造函数p3.2析构函数析构函数p3.3析构函数和构造函数的调用顺序析构函数和构造函数的调用顺序p3.4对象数组对象数组p3.5对象指针对象指针p3.6共用数据的保护共用数据的保护p3.7对象的动态建立和释放对象的动态建立和释放46本章内容本章内容q3.8 对象的赋值和复制对象的赋值和复制q3.9静态成员静态成员q3.10友元友元q3.11函数模板与类模板函数模板与类模板473.8对象的赋值和复制对象的赋值和复制3.8.1对象的赋值对象的赋值格式格式对象名对象名1对象名对象名2例如:例如:Timet1(10,30,0),t2;t2=t1;q作用作用 将对象将对象2 2的的数据成员数据成员
22、的值依次赋值给对象的值依次赋值给对象1 1;q注意注意 对象对象1 1和对象和对象2 2必须是同类的必须是同类的已定义已定义对象。对象。483.8对象的赋值和复制对象的赋值和复制3.8.2对象的复制对象的复制作用作用利用已有对象复制出新的对象。利用已有对象复制出新的对象。格式:格式:类名类名新新对象(已有对象);对象(已有对象);或或类名类名新新对象已有对象;对象已有对象;q建立新对象时建立新对象时自动自动调用复制构造函数。调用复制构造函数。49本章内容本章内容q3.8对象的赋值和复制对象的赋值和复制q3.9 静态成员静态成员q3.10友元友元q3.11函数模板与类模板函数模板与类模板503.
23、9静态成员静态成员q问题引入问题引入 在类的定义中,如何描述类的所有对象所共在类的定义中,如何描述类的所有对象所共享的数据?享的数据?q例如例如 对于之前定义的表示时间信息的类对于之前定义的表示时间信息的类TimeTime,如何,如何统计统计TimeTime类的对象的个数?类的对象的个数?513.9静态成员静态成员q解决方法解决方法q方法一:方法一:定义全局变量或对象定义全局变量或对象缺点:不安全,任何功能模块都可以更改;缺点:不安全,任何功能模块都可以更改;方法二:方法二:定义静态的数据成员定义静态的数据成员优点:可实现共享,并保证安全性。优点:可实现共享,并保证安全性。q静态成员静态成员静
24、态数据成员静态数据成员静态成员函数静态成员函数523.9静态成员静态成员3.9.1静态数据成员静态数据成员与普通数据成员的区别与普通数据成员的区别普通数据成员是普通数据成员是属于对象属于对象的,即在类的每一个对的,即在类的每一个对象中都拥有一个拷贝。象中都拥有一个拷贝。静态数据成员是静态数据成员是属于整个类属于整个类的,即每个类只有一的,即每个类只有一个拷贝,该类所有对象都共同拥有和使用。个拷贝,该类所有对象都共同拥有和使用。53voidfun()staticinti=0;i+;coutiendl;voidmain()for(intk=0;kst.score;ClassstudentPriva
25、te:intnum;floatscore;Public:student(intn,floats)num=n;score=s;FriendVoidteacher:sets();Student&st703.10.1友元函数友元函数(二)将成员函数声明为友元函数(二)将成员函数声明为友元函数注意:注意:1、两个类声明的先后顺序。、两个类声明的先后顺序。包含包含friend关键字的那个类关键字的那个类后后声明声明2、友元函数应先在类中声明,其定义应放在两个、友元函数应先在类中声明,其定义应放在两个类的声明后面。类的声明后面。713.10友元友元3.10.2友元类友元类作用作用类类B B是类是类A A的
26、友元类,则的友元类,则B B中所有的成员函数都中所有的成员函数都是是A A的友元函数,即所有的友元函数,即所有B B的成员函数都能访问的成员函数都能访问A A的的私有数据成员。私有数据成员。q友元类的声明格式友元类的声明格式friend类名;类名;q例如例如q此时那个类在前都可以,注意提前引用声明即可此时那个类在前都可以,注意提前引用声明即可。723.10友元友元3.10.2友元类友元类说明(说明(P111)友元关系是友元关系是单向单向的,而不是双向的。的,而不是双向的。友元关系友元关系不具有传递性不具有传递性。73本章内容本章内容q3.8对象的赋值和复制对象的赋值和复制q3.9静态成员静态成
27、员q3.10友元友元q3.11 模板模板743.11.1模板的概念模板的概念(一)什么是模板?(一)什么是模板?一种通用的函数和类的设计方法,即将函数或一种通用的函数和类的设计方法,即将函数或类处理的类处理的数据类型进行参数化数据类型进行参数化,在使用时再对数,在使用时再对数据类型进行实例化。据类型进行实例化。(二)作用(二)作用实现代码实现代码重用重用,提高程序开发效率。,提高程序开发效率。(三)模板的分类(三)模板的分类函数模板类模板753.11.2函数模板函数模板(一)函数模板的声明(一)函数模板的声明template(参数表)(参数表)/函数体定义函数体定义q注意:注意:T1,T2是参
28、数化类型,是参数化类型,class也可写为也可写为typename。763.11.3类模板类模板(一)问题引入(一)问题引入q举例举例1 1、定义对两个整数进行比较的类、定义对两个整数进行比较的类Compare_intCompare_int。2 2、定义对两个实数进行比较的类、定义对两个实数进行比较的类Compare_doubleCompare_double。773.11.3类模板类模板(一)问题引入(一)问题引入classCompare_intintx,y;public:Compare(inta,intb)x=a;y=b;intmax()returnxy?x:y;intmin()return
29、xy?x:y;doublemin()returnxy?x:y;793.11.3类模板类模板(一)问题引入(一)问题引入templateclassCompareTx,y;public:Compare(Ta,Tb)x=a;y=b;Tmax()returnxy?x:y;Tmin()returnxy?x:y;803.11.3类模板类模板(二)类模板的定义(二)类模板的定义1、定义格式、定义格式templateclass类模板名类模板名/类成员定义;类成员定义;其中:其中:class也可写为也可写为typename;813.11.3类模板类模板(二)类模板的定义(二)类模板的定义2、成员函数在类体外的定
30、义格式、成员函数在类体外的定义格式template返回类型返回类型类名类名:函数名函数名(形参表)(形参表)/成员函数定义体成员函数定义体823.11.3类模板类模板(三)类模板的对象的声明(三)类模板的对象的声明q声明格式声明格式类名类名对象;对象;例如:例如:Comparet1(5,10);编译器的处理过程编译器的处理过程1.根据指定参数类型生成根据指定参数类型生成模板类模板类;2.建立模板类的对象;建立模板类的对象;83总结总结q3.1构造函数构造函数q构造函数的作用构造函数的作用q构造函数的特点构造函数的特点q构造函数的参数形式构造函数的参数形式q3.2析构函数析构函数q析构函数的作用
31、析构函数的作用q析构函数的特点析构函数的特点q3.3构造函数和析构函数的调用顺序构造函数和析构函数的调用顺序84q3.4对象数组对象数组q对象数组的定义对象数组的定义q对象数组的初始化对象数组的初始化q数组元素的存取格式数组元素的存取格式q3.5对象指针对象指针q指向对象的指针指向对象的指针q指向对象成员的指针指向对象成员的指针q指向对象数据成员的指针指向对象数据成员的指针q指向对象成员函数的指针指向对象成员函数的指针qthis指针指针85q3.6共用数据的保护共用数据的保护q常对象常对象q常对象成员常对象成员q指向对象的常指针指向对象的常指针q指向常对象的指针变量指向常对象的指针变量q对象的
32、常引用对象的常引用q3.7对象的动态建立与释放对象的动态建立与释放q3.8对象的赋值和复制对象的赋值和复制86q3.9静态成员静态成员q静态数据成员静态数据成员q静态成员函数静态成员函数q3.10友元(员)友元(员)q将普通函数声明为友元函数将普通函数声明为友元函数q将成员函数声明为友元函数将成员函数声明为友元函数q友元类友元类q3.11模板模板q函数模板函数模板q类模板类模板87目标目标q理解构造函数与析构函数的作用;理解构造函数与析构函数的作用;q熟练掌握构造函数和析构函数的定义和使用。熟练掌握构造函数和析构函数的定义和使用。q掌握对象数组、对象指针的使用,以及对象的动掌握对象数组、对象指
33、针的使用,以及对象的动态建立与释放;态建立与释放;q了解对象的赋值与复制了解对象的赋值与复制q理解静态成员和友元的作用理解静态成员和友元的作用q熟练掌握静态成员和友元的定义与使用熟练掌握静态成员和友元的定义与使用q了解类模板的定义与使用了解类模板的定义与使用88实验四实验四静态成员与友元静态成员与友元q实验内容:实验内容:q1、定义一个学生类:、定义一个学生类:studentq一个数据成员一个数据成员score,表示分数,表示分数q两个静态数据成员:两个静态数据成员:total(总分)、(总分)、count(学(学生人数)生人数)q成员函数成员函数set(floats):设置分数、累计总分和):设置分数、累计总分和学生人数学生人数q静态成员函数:静态成员函数:sum():显示总分():显示总分q静态成员函数:静态成员函数:average():显示平均分():显示平均分q在在main函数中,输入某班学生成绩,求总分函数中,输入某班学生成绩,求总分和平均分。和平均分。89q2、P119-10,提示,提示display函数有两个参数函数有两个参数q3、P119-11q上机时间:第七周周二三单元软一上机时间:第七周周二三单元软一q实验报告上交时间:第七周周四五单元实验报告上交时间:第七周周四五单元90演讲完毕,谢谢观看!
限制150内