C++谭浩强课件_9章.ppt

上传人:资****亨 文档编号:127272310 上传时间:2020-03-31 格式:PPT 页数:131 大小:259.50KB
返回 下载 相关 举报
C++谭浩强课件_9章.ppt_第1页
第1页 / 共131页
C++谭浩强课件_9章.ppt_第2页
第2页 / 共131页
C++谭浩强课件_9章.ppt_第3页
第3页 / 共131页
C++谭浩强课件_9章.ppt_第4页
第4页 / 共131页
C++谭浩强课件_9章.ppt_第5页
第5页 / 共131页
点击查看更多>>
资源描述

《C++谭浩强课件_9章.ppt》由会员分享,可在线阅读,更多相关《C++谭浩强课件_9章.ppt(131页珍藏版)》请在金锄头文库上搜索。

1、第9章关于类和对象的进一步讨论 9 1构造函数9 2析构函数9 3调用构造函数和析构函数的顺序9 4对象数组9 5对象指针9 6共用数据的保护9 7对象的动态建立和释放9 8对象的赋值和复制9 9静态成员9 10友元9 11类模板 在建立一个对象时 常常需要作某些初始化的工作 例如对数据成员赋初值 如果一个数据成员未被赋值 则它的值是不可预知的 因为在系统为它分配内存时 保留了这些存储单元的原状 这就成为了这些数据成员的初始值 这种状况显然是与人们的要求不相符的 对象是一个实体 它反映了客观事物的属性 例如时钟的时 分 秒的值 是应该有确定的值的 注意 类的数据成员是不能在声明类时初始化的 9

2、 1构造函数9 1 1对象的初始化 如果一个类中所有的成员都是公用的 则可以在定义对象时对数据成员进行初始化 如classTime public 声明为公用成员hour minute sec Timet1 14 56 30 将t1初始化为14 56 30这种情况和结构体变量的初始化是差不多的 在一个花括号内顺序列出各公用数据成员的值 两个值之间用逗号分隔 但是 如果数据成员是私有的 或者类中有private或protected的成员 就不能用这种方法初始化 在第8章的几个例子中 是用成员函数来对对象中的数据成员赋初值的 例如例8 3中的set time函数 从例8 3中可以看到 用户在主函数中

3、调用set time函数来为数据成员赋值 如果对一个类定义了多个对象 而且类中的数据成员比较多 那么 程序就显得非常臃肿烦琐 为了解决这个问题 C 提供了构造函数 constructor 来处理对象的初始化 构造函数是一种特殊的成员函数 与其他成员函数不同 不需要用户来调用它 而是在建立对象时自动执行 构造函数的名字必须与类名同名 而不能由用户任意命名 以便编译系统能识别它并把它作为构造函数处理 它不具有任何类型 不返回任何值 构造函数的功能是由用户定义的 用户根据初始化的要求设计函数体和函数参数 9 1 2构造函数的作用 例9 1在例8 3基础上定义构造成员函数 includeusingna

4、mespacestd classTime public Time 定义构造成员函数 函数名与类名相同 hour 0 利用构造函数对对象中的数据成员赋初值minute 0 sec 0 voidset time 函数声明voidshow time 函数声明private inthour 私有数据成员intminute intsec voidTime set time 定义成员函数 向数据成员赋值 cin hour cin minute cin sec voidTime show time 定义成员函数 输出数据成员的值 cout hour minute sec endl intmain Timet

5、1 建立对象t1 同时调用构造函数t1 Time t1 set time 对t1的数据成员赋值t1 show time 显示t1的数据成员的值Timet2 建立对象t2 同时调用构造函数t2 Time t2 show time 显示t2的数据成员的值return0 程序运行的情况为 102554 从键盘输入新值赋给t1的数据成员 10 25 54 输出t1的时 分 秒值 0 0 0 输出t2的时 分 秒值 上面是在类内定义构造函数的 也可以只在类内对构造函数进行声明而在类外定义构造函数 将程序中的第4 7行改为下面一行 Time 对构造函数进行声明在类外定义构造函数 Time Time 在类外

6、定义构造成员函数 要加上类名Time和域限定符 hour 0 minute 0 sec 0 有关构造函数的使用 有以下说明 1 在类对象进入其作用域时调用构造函数 2 构造函数没有返回值 因此也不需要在定义构造函数时声明类型 这是它和一般函数的一个重要的不同之点 3 构造函数不需用户调用 也不能被用户调用 4 在构造函数的函数体中不仅可以对数据成员赋初值 而且可以包含其他语句 但是一般不提倡在构造函数中加入与初始化无关的内容 以保持程序的清晰 5 如果用户自己没有定义构造函数 则C 系统会自动生成一个构造函数 只是这个构造函数的函数体是空的 也没有参数 不执行初始化操作 在例9 1中构造函数不

7、带参数 在函数体中对数据成员赋初值 这种方式使该类的每一个对象都得到同一组初值 例如例9 1中各数据成员的初值均为0 但是有时用户希望对不同的对象赋予不同的初值 可以采用带参数的构造函数 在调用不同对象的构造函数时 从外面将不同的数据传递给构造函数 以实现不同的初始化 构造函数首部的一般格式为构造函数名 类型1形参1 类型2形参2 前面已说明 用户是不能调用构造函数的 因此无法采用常规的调用函数的方法给出实参 实参是在定义对象时给出的 定义对象的一般格式为类名对象名 实参1 实参2 9 1 3带参数的构造函数 例9 2有两个长方柱 其长 宽 高分别为 1 12 20 25 2 10 14 20

8、 求它们的体积 编一个基于对象的程序 在类中用带参数的构造函数 includeusingnamespacestd classBox public Box int int int 声明带参数的构造函数intvolume 声明计算体积的函数private intheight intwidth intlength Box Box inth intw intlen 在类外定义带参数的构造函数 height h width w length len intBox volume 定义计算体积的函数 return height width length intmain Boxbox1 12 25 30 建立

9、对象box1 并指定box1长 宽 高的值cout Thevolumeofbox1is box1 volume endl Boxbox2 15 30 21 建立对象box2 并指定box2长 宽 高的值cout Thevolumeofbox2is box2 volume endl return0 程序运行结果如下 Thevolumeofbox1is9000Thevolumeofbox2is9450可以知道 1 带参数的构造函数中的形参 其对应的实参在定义对象时给定 2 用这种方法可以方便地实现对不同的对象进行不同的初始化 在9 1 3节中介绍的是在构造函数的函数体内通过赋值语句对数据成员实现初

10、始化 C 还提供另一种初始化数据成员的方法 参数初始化表来实现对数据成员的初始化 这种方法不在函数体内对数据成员初始化 而是在函数首部实现 例如例9 2中定义构造函数可以改用以下形式 Box Box inth intw intlen height h width w length len 这种写法方便 简练 尤其当需要初始化的数据成员较多时更显其优越性 甚至可以直接在类体中 而不是在类外 定义构造函数 9 1 4用参数初始化表对数据成员初始化 在一个类中可以定义多个构造函数 以便对类对象提供不同的初始化的方法 供用户选用 这些构造函数具有相同的名字 而参数的个数或参数的类型不相同 这称为构造函

11、数的重载 在第4章第4 6节中所介绍的函数重载的知识也适用于构造函数 通过下面的例子可以了解怎样应用构造函数的重载 9 1 5构造函数的重载 例9 3在例9 2的基础上 定义两个构造函数 其中一个无参数 一个有参数 includeusingnamespacestd classBox public Box 声明一个无参的构造函数Box inth intw intlen height h width w length len 声明一个有参的构造函数 用参数的初始化表对数据成员初始化intvolume private intheight intwidth intlength Box Box 定义一个

12、无参的构造函数 height 10 width 10 length 10 intBox volume return height width length intmain Boxbox1 建立对象box1 不指定实参cout Thevolumeofbox1is box1 volume endl Boxbox2 15 30 25 建立对象box2 指定3个实参cout Thevolumeofbox2is box2 volume endl return0 在本程序中定义了两个重载的构造函数 其实还可以定义其他重载构造函数 其原型声明可以为Box Box inth 有1个参数的构造函数Box Box

13、 inth intw 有两个参数的构造函数在建立对象时分别给定1个参数和2个参数 说明 1 调用构造函数时不必给出实参的构造函数 称为默认构造函数 defaultconstructor 显然 无参的构造函数属于默认构造函数 一个类只能有一个默认构造函数 2 如果在建立对象时选用的是无参构造函数 应注意正确书写定义对象的语句 3 尽管在一个类中可以包含多个构造函数 但是对于每一个对象来说 建立对象时只执行其中一个构造函数 并非每个构造函数都被执行 构造函数中参数的值既可以通过实参传递 也可以指定为某些默认值 即如果用户不指定实参值 编译系统就使形参取默认值 在第4章第4 8节中介绍过在函数中可以

14、使用有默认值的参数 在构造函数中也可以采用这样的方法来实现初始化 例9 3的问题也可以使用包含默认参数的构造函数来处理 例9 4将例9 3程序中的构造函数改用含默认值的参数 长 宽 高的默认值均为10 在例9 3程序的基础上改写如下 9 1 6使用默认参数的构造函数 includeusingnamespacestd classBox public Box inth 10 intw 10 intlen 10 在声明构造函数时指定默认参数intvolume private intheight intwidth intlength Box Box inth intw intlen 在定义函数时可以不

15、指定默认参数 height h width w length len intBox volume return height width length intmain Boxbox1 没有给实参cout Thevolumeofbox1is box1 volume endl Boxbox2 15 只给定一个实参cout Thevolumeofbox2is box2 volume endl Boxbox3 15 30 只给定2个实参cout Thevolumeofbox3is box3 volume endl Boxbox4 15 30 20 给定3个实参cout Thevolumeofbox4i

16、s box4 volume endl return0 程序运行结果为Thevolumeofbox1is1000Thevolumeofbox2is1500Thevolumeofbox3is4500Thevolumeofbox4is9000程序中对构造函数的定义 第12 16行 也可以改写成参数初始化表的形式 Box Box inth intw intlen height h width w length len 可以看到 在构造函数中使用默认参数是方便而有效的 它提供了建立对象时的多种选择 它的作用相当于好几个重载的构造函数 它的好处是 即使在调用构造函数时没有提供实参值 不仅不会出错 而且还确保按照默认的参数值对对象进行初始化 尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便 说明 1 应该在声明构造函数时指定默认值 而不能只在定义构造函数时指定默认值 2 程序第5行在声明构造函数时 形参名可以省略 3 如果构造函数的全部参数都指定了默认值 则在定义对象时可以给一个或几个实参 也可以不给出实参 4 在一个类中定义了全部是默认参数的构造函数后 不能再定义重载构造函数 析构函

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号