c讲稿Chapter3关于类和对象的进一步讨论

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1回顾第2章类和对象对象、对象的两个要素类面向对象程序设计的三大特性类的定义对象的定义与使用第3章关于类和对象的进一步讨论3本章内容3.1构造函数3.2析构函数3.3调用构造函数和析构函数的顺序3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放4本章内容3.8对象的赋值和复制3.9静态成员3.10友员3.11函数模板与类模板5目标理解构造函数与析构函数的作用;熟练掌握构造函数和析构函数的定义和使用。掌握对象数组、对象指针的使用,以及对象的动态建立与释放;了解对象的赋值与复制理解静态成员和友元的作用熟练掌握静态成员和友元的定义与使用了解函数模板与类模板的定义与使用6本章内容3.1构造函数3.2析构函数3.3调用构造函数和析构函数的顺序3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放73.1构造函数3.1.1对象的初始化定义对象时最好能给对象的数据成员进行初始化,但不能在类的声明中进行。例如:classTime{private:inth=0;//错误!!};类是个抽象的自定义数据类型,不占存储空间,无法存储数据83.1构造函数3.1.2构造函数的作用构造函数是类中一种特殊的成员函数。构造函数的作用是在系统创建对象时,给对象的数据成员进行初始化。格式:类名([参数表]){函数体;}注意类外定义的格式93.1构造函数3.1.2构造函数的作用构造函数的特点1、构造函数名字必须与类名相同,不具有任何类型,也不返回任何值。2、构造函数的权限必须是public。3、构造函数不需要也不能被用户调用,而是在建立对象时由系统自动调用执行。4、每个类都必须有一个构造函数,用户没有定义时,系统会自动生成一个空的构造函数。103.1构造函数3.1.3无参和带参的构造函数(一)无参数的构造函数(默认构造函数)格式:类名(){数据成员=初始值;}对象的定义格式:类名对象名;113.1构造函数3.1.3无参和带参的构造函数(二)带参数的构造函数类名(类型1参数1,类型2参数2,……){数据成员1=参数1;数据成员2=参数2;……}对象的定义格式为:类名对象名(实参1,实参2,……);123.1构造函数3.1.4用参数初始化表对数据成员初始化参数初始化表——对数据成员的初始化放在函数首部实现。格式:类名(类型1参数1,类型2参数2,……):数据成员1(参数1),数据成员2(参数2),……{}对象的定义格式为:类名对象名(实参1,实参2,……);133.1构造函数3.1.5构造函数的重载定义在一个类中可以定义多个构造函数,其参数的个数、顺序或类型不相同。调用建立对象时,系统将根据对象的实参个数、类型去匹配对应的构造函数。143.1构造函数3.1.6带默认参数的构造函数格式:类名(类型1参数1=默认值1,类型2参数2=默认值2,……){数据成员1=参数1;数据成员2=参数2;……}15构造函数补充说明在调用构造函数时,不必给出实参的构造函数,称之为默认构造函数全部参数都指定了默认值的构造函数也属于默认构造函数一个类只能有一个默认构造函数定义了全部是默认参数的构造函数后,不能在定义重载构造函数如果定义了任何其他的构造函数,编译器就不会为你自动生成缺省的构造函数163.2析构函数(一)析构函数的作用析构函数的作用是在系统撤销对象占用的内存之前,完成一些清理工作。格式~类名(){函数体;}173.2析构函数(二)析构函数的特点1、析构函数名是在类名前加“~”,无返回类型,无参数。2、析构函数无参数,故不能被重载。3、当系统撤销对象之前将调用析构函数。P78注意:析构函数也可被用户当普通函数进行调用,但不影响系统在撤销对象时的自动调用。18classStudent{private:char*pName;public:Student(){pName=newchar[20];}~Student(){delete[]pName;}};19类和对象类数据成员成员函数对象数据成员数据成员对象20小结构造函数构造函数的作用构造函数的特点无参和带参的构造函数用参数初始化表对数据成员初始化构造函数的重载带默认参数的构造函数析构函数析构函数的作用析构函数的特点21本章内容3.1构造函数3.2析构函数3.3构造函数和析构函数的调用顺序3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放223.4对象数组对象数组指由同类的多个对象构成的集合。(一)对象数组定义格式:类名对象数组名[常量表达式];类名对象数组名[常量表达式1][常量表达式2];233.4对象数组对象数组(二)对象数组的初始化格式类名对象数组名[常量表达式]={类名(实参列表1),类名(实参列表2),……};243.4对象数组对象数组(三)数组元素的存取格式:对象数组名[下标].数据成员对象数组名[下标].成员函数25本章内容3.1构造函数3.2析构函数3.3对象的赋值和复制3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放263.5对象指针3.5.1指向对象的指针3.5.2指向对象成员的指针3.5.3this指针273.5对象指针3.5.1指向对象的指针定义格式:类名*对象指针名访问格式:对象指针-数据成员对象指针-成员函数(实参列表)283.5对象指针3.5.1指向对象的指针例如:Timet1(10,30,30);t1.ShowTime();Time*p;p=&t1;p-SetTime(8,0,0);t1.ShowTime();293.5对象指针3.5.2指向对象成员的指针(一)指向对象数据成员的指针定义格式:类型*指针变量名访问格式:指针变量名=&对象.成员名;注意:所指向的数据成员必须为public。303.5对象指针3.5.2指向对象成员的指针(一)指向对象数据成员的指针定义格式:类型*指针变量名访问格式:指针变量名=&对象.成员名;例如:Timet1(10,30,30);int*p;p=&t1.h;//若h为public成员313.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针1、指向普通函数的指针函数在编译时被分配到一个入口地址,称为函数的指针。函数名代表该函数的入口地址。323.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针1、指向普通函数的指针定义形式:返回类型(*指针变量名)(形参列表)赋值形式:指针变量名=函数名333.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针1、指向普通函数的指针函数调用形式:函数名(实参)(*指针变量名)(实参列表)举例:sum函数343.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针2、指向对象成员函数的指针举例:时间类Time35#includeiostreamusingnamespacestd;classTime{inth,m,s;public:Time(inthh=0,intmm=0,intss=0){h=hh;m=mm;s=ss;}voidShowTime(){couth:m:sendl;}};363.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针2、指向对象成员函数的指针定义形式:返回类型(类名::*指针变量名)(形参列表)赋值形式:指针变量名=&类名::成员函数名注意:所指向的成员函数必须为public。373.5对象指针3.5.2指向对象成员的指针(二)指向对象成员函数的指针2、指向对象成员函数的指针函数调用形式:对象.成员函数名(实参)(对象.*指针变量名)(实参列表)注意:定义时用类名,使用时用对象名383.5对象指针3.5.3this指针每一个成员函数都有一个隐含的特殊指针——this指针。This指针的值为当前调用的该成员函数的对象的首地址。例如:39类和对象成员函数对象数据成员数据成员对象40classTime{inth,m,s;public:voidSetTime(inth=0,intm=0,ints=0){this-h=h;this-m=m;this-s=s;}voidShowTime(){couth:m:sendl;}};41本章内容3.1构造函数3.2析构函数3.3对象的赋值和复制3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放423.6共用数据的保护3.6.1常对象3.6.2常对象成员3.6.3指向对象的常指针3.6.4指向常对象的指针变量3.6.5对象的常引用43本章内容3.1构造函数3.2析构函数3.3析构函数和构造函数的调用顺序3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放443.7对象的动态建立与释放3.7对象的动态建立与释放动态创建和撤销一个对象指针名=new类名(初值);delete指针名;注意1、使用new创建对象时自动调用构造函数,delete撤销对象之前自动调用析构函数;2、动态创建的对象必须使用delete进行撤销。453.7对象的动态建立与释放3.7对象的动态建立与释放动态创建和撤销一维对象数组对象指针=new类名[数组大小];delete[]对象指针;注意1、构造函数和析构函数的调用次数与数组的大小相同。2、此时只能调用默认构造函数,不能给参数3、注意构造函数和析构函数的调用顺序。46本章内容3.1构造函数3.2析构函数3.3析构函数和构造函数的调用顺序3.4对象数组3.5对象指针3.6共用数据的保护3.7对象的动态建立和释放47本章内容3.8对象的赋值和复制3.9静态成员3.10友元3.11函数模板与类模板483.8对象的赋值和复制3.8.1对象的赋值格式对象名1=对象名2例如:Timet1(10,30,0),t2;t2=t1;作用将对象2的数据成员的值依次赋值给对象1;注意对象1和对象2必须是同类的已定义对象。493.8对象的赋值和复制3.8.2对象的复制作用——利用已有对象复制出新的对象。格式:类名新对象(已有对象);或类名新对象=已有对象;建立新对象时自动调用复制构造函数。50本章内容3.8对象的赋值和复制3.9静态成员3.10友元3.11函数模板与类模板513.9静态成员问题引入在类的定义中,如何描述类的所有对象所共享的数据?例如对于之前定义的表示时间信息的类Time,如何统计Time类的对象的个数?523.9静态成员解决方法方法一:定义全局变量或对象缺点:不安全,任何功能模块都可以更改;方法二:定义静态的数据成员优点:可实现共享,并保证安全性。静态成员静态数据成员静态成员函数533.9静态成员3.9.1静态数据成员与普通数据成员的区别普通数据成员是属于对象的,即在类的每一个对象中都拥有一个拷贝。静态数据成员是属于整个类的,即每个类只有一个拷贝,该类所有对象都共同拥有和使用。54voidfun(){staticinti=0;i++;coutiendl;}voidmain(){for(intk=0;k3;k++)fun();fun();}//只被赋值一次,程序退出时消失553.9静态成员3.9.1静态数据成员定义方式(一)在类内声明静态数据成员static类型名成员名;例如:classTime{……staticintcount;};563.9静态成员3.9.1静态数据成员定义方式(一)在类内声明静态数据成员static类型名成员名;注意:1、静态数据成员同样具有访问控制权限。2、静

1 / 90
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功