




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验10类与对象1(2)请将自己报告部分,文字和程序代码,加粗完成下面实验内容和实验要求。 自测练习 1实验10自测题2 定义一个书籍类Book,其成员数据包括名称name、作者author、出版社press和页数numberOfPages。实现一个打印自身信息的内联成员函数printBook(),将修改出版社的函数setPress()实现为带默认参数值的函数,默认的参数为”清华大学出版社”。生成一个出版社为”高等教育出版社”的Book对象,调用setPress()成员函数将出版社修改为”清华大学出版社”,调用printBook()成员函数打印修改出版社前后的对象信息。 要求给出缺省构造函数和带所有成员数据的构造函数 思路参考教材中“类的成员函数为带默认参数值的函数和内联成员函数”的相关代码将下面程序代码补充完整,并运行#include / 包含头文件iostreamusing namespace std; / 使用命名空间stdclass Book / 类Book的定义public:Book();/ 显式的默认构造函数Book(char* pName, char* pAuthor, char* pPess, int pNumberOfpages); / 带参数构造函数void printBook();/ 隐式内联函数void setPress(char* pPress = 清华大学出版社)if (press != 0) delete press;press = new charstrlen(pPress) + 1;if (press != 0)strcpy(press, pPress);Book();private:char* name;char* author;char* press; / 三个野指针int numberofpages;Book:Book()/ 显式默认构造函数用来创建和初始化对象(一般情况下,指针初始化为NULL,int,float,double,char等初始化为0,对象成员初始化,如string,#include ,等等等等,这样防止因为数据未初始化造成的程序异常,主要作用是提高程序的鲁棒性)name = NULL;author = NULL;press = NULL; / 三个空指针,初始化的时候置为空,指针本身是一个占有四字节内存空间的数据类型,类比int,charnumberofpages = 0;/Book缺省构造函数的实现cout Constructed without any parameter endl;Book:Book(char* pName, char* pAuthor, char* pPress, int pNumberOfPages)/ Book带所有成员数据的构造函数的实现name = new charstrlen(pName) + 1;if (name != 0)strcpy(name, pName);author = new charstrlen(pAuthor) + 1;if (author != 0)strcpy(author, pAuthor);press = new charstrlen(pPress) + 1;if (press != 0)strcpy(press, pPress);numberofpages = pNumberOfPages;cout Constructed with parameters endl;inline void Book:printBook() / 显式内联函数/ Book内联成员函数printBook的实现cout The book information is: endl mame: name , author: author , press: press , number of pages: numberofpages endl;void Book:setPress(char* pPress = 清华大学出版社)/ Book成员函数setPress的实现if (press != 0) delete press; / 这个if条件句保证释放掉之前press指向的堆区/ 指针!=0相当于指针!=NULL,0是唯一一个可以跟指针比较的数,为什么要有,new的时候有,delete的时候也加上,如果是基本类型的指针比如int,char,可以用delete或者delete,但是如果是对象数组必须使用delete,不然只会析构第一个对象,如Book *b = new Book2;用delete b可以析构b0和b1;如果用delete b只会析构b0,习惯上new对应delete,new对应delete。press = new charstrlen(pPress) + 1;if (press != 0)strcpy(press, pPress);Book:Book()delete name;delete author;delete press;name = NULL;author = NULL;press = NULL;/ 同样的指针指向的区域释放完成之后也将指针本身置为NULL,防止产生野指针。指针本身同int,char一样是一种数据类型,存放在栈区,由操作系统负责释放,所以Book的成员numberofpages不需要手动释放,同样name,author和press指针本身也不需要手动释放。 cout Destructing endl;int main()Book bk(微机原理与接口技术, 姚琳, 高等教育出版社, 271);bk.printBook();bk.setPress();bk.printBook();return 0;/ 程序结束之后Book对象bk在操作系统作用下自动释放,调用析构函数,手动申请的内存区域,同样Book的成员numberofpages以及name,author和press三个指针本身也在操作系统作用下自动释放,如果使用Book *b=new Book(微机原理与接口技术, 姚琳, 高等教育出版社, 271),还需要手动调用delete b;/ 所以对大型工程来说,大量的内存泄露会影响运行效率,但是当程序运行结束之后操作系统会收回所有由该程序申请的空间,包括堆区和栈区。对于该程序来说,只要点击DOS黑框的X号,就会收回所有申请的空间。 运行结果(1) 野指针与空指针(2) 隐式内联函数(3) 显式的默认构造函数及其作用(4) 指针本身的属性(5) NULL(6) 指针!=0(7) delete和delete(8) 栈区和堆区(9) 手动释放与自动释放(10) 释放的时机 思考题及问题考虑如何将内联成员函数setPress实现为另外一种形式(不使用关键字inline)?答:采用隐式内联函数,即在类的定义中写出内联语句,不使用函数声明的形式。2实验10自测题3 定义一个工程师类Engineer,其成员数据包括编号id、姓名name和职称position,实现一个打印自身信息的成员函数printEngineer(),定义一个包含4个工程师对象的对象数组,并使用new运算符申请两个匿名对象。调用printEngineer()打印所有对象的信息。 要求给出Engineer类的构造函数和析构函数 思路参考实验10练习题3及教材中“对象数组和对象指针”的相关代码将下面程序代码补充完整,并运行#include / 包含头文件iostreamusing namespace std; / 使用命名空间stdclass Engineer/类Engineer的定义public:Engineer();Engineer(int pId, char* pName, char* pPosition);void setEngineer(int pId, char* pName, char* pPosition);Engineer();void printEngineer();private:int id;char* name;char* position;Engineer:Engineer()id = 0;name = NULL;position = NULL;cout Constructed without any parameter endl;Engineer:Engineer(int pId, char* pName, char* pPosition)/Engineer的构造函数的实现id = pId;name = new charstrlen(pName) + 1;if (name != 0)strcpy(name, pName);position = new charstrlen(pPosition) + 1;if (position != 0)strcpy(position, pPosition);void Engineer:setEngineer(int pId, char* pName, char* pPosition)/Engineer的成员函数setEngineer的实现id = pId;name = new charstrlen(pName) + 1;if (name != 0)strcpy(name, pName);position = new charstrlen(pPosition) + 1;if (position != 0)strcpy(position, pPosition);Engineer:Engineer()/Engineer的析构函数的实现cout destructing. endl;delete name;delete position;name = NULL;position = NULL;void Engineer:printEngineer()/Engineer的成员函数prinEngineer的实现cout id: id , name: name , position: position , printEngineer();pE2-printEngineer();delete pE1;delete pE2; / 写成delete pE1,pE2。这样只会释放pE1,也就是总共会调用5个析构函数。return 0; 运行结果 思考题及问题删除Engineer ()构造函数,程序是否还能正常运行?删除delete pE1,pE2;语句,会造成什么后果?程序运行的结果又是什么?/ 隐式默认构造函数是在没有定义任何显式构造函数的前提下由系统自动提供的,换句话说,如果自己定义了显式的默认构造函数或显式的带参数的构造函数,系统将不会提供隐式的默认构造函数。/ 习惯上最好用显式的默认构造函数答:在Engineer e4对象创建时,程序调用缺省参数的默认构造函数,要么是系统提供的隐式默认构造函数,要么是自己定义的显式默认构造函数。如果不声明Engineer (int pId, char* pName, char* pPosition);那么系统会自动创建一个缺省的构造函数;但是题目给的程序声明了,系统就不自动创建了,需要手动添加缺省构造函数,否则不能通过编译。删除delete pE1,pE2;语句,程序能够正常运行,运行的结果中只有四个destructing,说明有申请的空间未释放,造成了内存的泄露。/ 对象同样有堆区和栈区之分,分别进行手动释放和自动释放3实验10自测题4 定义一个计算机类Computer,其成员数据包括计算机编号id、品牌brand、主频mainFrequency和硬盘大小hardDisk,实现一个打印自身信息的成员函数printComputer()。定义默认构造函数、带所有成员数据的构造函数和拷贝构造函数。设某单位有5个品牌都是“IBM”的计算机,使用带所有成员数据的构造函数生成一个计算机对象,使用拷贝构造函数生成另外4个汽车对象,并通过调用修改编号、主频和硬盘大小的成员函数进行相应调整。最后调用printComputer()打印所有计算机对象的信息。 要求给出Computer类的拷贝构造函数和析构函数 思路参考教材中“拷贝构造函数”的相关代码 将下面程序代码补充完整,并运行#include / 包含头文件iostreamusing namespace std; / 使用命名空间stdclass Computer/ Computer类的定义public:Computer();Computer(int pId, char* pBrand, float pMainFrequency, float pHardDisk);Computer(Computer& computer1);Computer();void printComputer();void setId(int pId);void setMainFrequency(float pMainFrequency);void setHardDisk(float pHardDisk);private:int id;char* brand;float mainfrequency;float harddisk;Computer:Computer()id = 0;brand = NULL;mainfrequency = 0;harddisk = 0;cout Constructed without any parameter. endl;Computer:Computer(int pId, char* pBrand, float pMainFrequency, float pHardDisk)/ Computer带参数的构造函数实现id = pId;brand = new charstrlen(pBrand) + 1;if (brand != 0)strcpy(brand, pBrand);mainfrequency = pMainFrequency;harddisk = pHardDisk;cout Constructed with all parameters. endl;Computer:Computer(Computer& computer1)/ Computer拷贝构造函数的实现id = computer1.id;brand = new charstrlen(computer1.brand) + 1;if (brand != 0)strcpy(brand, computer1.brand);mainfrequency = computer1.mainfrequency;harddisk = computer1.harddisk;cout Copy Constucted. endl;Computer:Computer()delete brand;brand = NULL;cout Deconstructed. endl;void Computer:printComputer()cout id: id , brand: brand , mainFrequency: mainfrequency , hardDisk: harddisk endl;void Computer:setId(int pId)id = pId;void Computer:setMainFrequency(float pMainFrequency)/设置主频值mainfrequency = pMainFrequency;void Computer:setHardDisk(float pHardDisk)/设置硬盘大小harddisk = pHardDisk;int main()Computer computer1(1001, IBM, 1.8f, 500.f);Computer computer2 = computer1;computer2.setId(1002);computer2.setMainFrequency(2.f);computer2.setHardDisk(1000.f);Computer computer3 = computer1;computer3.setId(1003);computer3.setMainFrequency(2.5f);computer3.setHardDisk(1500.f);Computer computer4 = computer1;computer4.setId(1004);computer4.setMainFrequency(2.f);computer4.setHardDisk(1200.f);computer1.printComputer();computer2.printComputer();computer3.printComputer();computer4.printComputer();return 0; 运行结果 思考题及问题删除拷贝构造函数,程序还是否能够正常运行?答:编译和链接没有问题,但不能正常运行。删除自己定义的拷贝构造函数,系统会提供默认的拷贝构造函数。对于该程序,系统提供的默认拷贝构造函数如下Computer:Computer(Computer& computer1)/ Computer拷贝构造函数的实现id = computer1.id;brand = computer.brand;mainfrequency = computer1.mainfrequency;harddisk = computer1.harddisk;cout Copy Constucted. endl;在退出运行时,由于多个对象的指针指向同一个堆空间中的资源,当调用析构函数先后删除这几个堆空间中的资源时,造成同一对空间的多重释放,造成错误。习惯上,如果一个类含有指针类型的成员,也就是需要析构函数来释放资源的时候,需要手动定义深拷贝构造函数。4编程题 题目:创建一个名为Account的类,银行可以使用它表示客户的银行帐户。这个类应该包括一个类型为double的数据成员,表示帐户余额。这个类必须提供一个构造函数,它接受初始余额并用它初始化数据成员。这个构造函数应当确认初始余额的有效性,保证它大于或等于0.否则,余额应当设置为0,并且构造函数必须显示一条错误信息,指出初始余额是无效的。该类还要提供三个成员函数。成员函数credit将一笔金额加到当前余额中。debit将从这个Account中取钱,并保证取出金额不超过此Account的余额。如果不是这样,余额不变,函数打印一条信息,指出“Debit amount exceeded account balace.”。成员函数getBalance将返回当前余
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源行业企业社会责任信息披露现状与改进建议报告
- 农发行赤峰市翁牛特旗2025秋招数据分析师笔试题及答案
- 2025年生物质能供热系统资源循环利用与节能报告
- 食堂食品卫生安全考试题
- 普通话二级甲等考试试题
- 2025年新能源行业绿色制造工艺标准在新能源企业品牌建设中的应用报告
- 2025年高中阅读卷子题目及答案
- 2025年文化旅游演艺项目文化旅游产业创新模式与市场拓展报告
- 农发行邯郸市峰峰矿区2025秋招笔试热点题型专练及答案
- 安全工程师真题及答案
- 2025-2026学年人教精通版四年级英语上册(全册)教学设计(附目录)
- 平地机操作规程
- GB/T 39141.3-2022无机和蓝宝石手表玻璃第3部分:定性标准和试验方法
- GB/T 1142-2004套式扩孔钻
- 2022年天津市河东区生态环境系统事业单位招聘笔试试题及答案
- 研究生学术道德与学术规范课件
- 浦发银行个人信用报告异议申请表
- 电镀行业环境执法现场检查要点
- 趣味成语 完整版PPT
- 喷漆质量处罚条例
- 回转支承选型计算
评论
0/150
提交评论