实验10.docx
《实验10.docx》由会员分享,可在线阅读,更多相关《实验10.docx(16页珍藏版)》请在冰豆网上搜索。
实验10
实验10类与对象1
(2)
请将自己报告部分,文字和程序代码,加粗
完成下面实验内容和实验要求。
自测练习
1.实验10自测题2
⑴定义一个书籍类Book,其成员数据包括名称name、作者author、出版社press和页数numberOfPages。
实现一个打印自身信息的内联成员函数printBook(),将修改出版社的函数setPress()实现为带默认参数值的函数,默认的参数为”清华大学出版社”。
生成一个出版社为”高等教育出版社”的Book对象,调用setPress()成员函数将出版社修改为”清华大学出版社”,调用printBook()成员函数打印修改出版社前后的对象信息。
⑵要求
给出缺省构造函数和带所有成员数据的构造函数
⑶思路
参考教材中“类的成员函数为带默认参数值的函数和内联成员函数”的相关代码
⑷将下面程序代码补充完整,并运行
#include//包含头文件iostream
usingnamespacestd;//使用命名空间std
classBook
{
public:
Book();
Book(constchar*pName,constchar*pAuthor,constchar*pPress,intpNumberOfPages);
voidsetPress(constchar*pPress);
voidprintBook();
~Book();
private:
char*name;
char*author;
char*press;
intnumberOfpages;
//类Book的定义
};
Book:
:
Book()
{*name;
*author;
*press;
numberOfpages;
//Book缺省构造函数的实现
}
Book:
:
Book(constchar*pName,constchar*pAuthor,constchar*pPress,intpNumberOfPages)
{name=newchar[strlen(pName)+1];
if(pName!
=0)
strcpy(name,pName);
author=newchar[strlen(pAuthor)+1];
if(pAuthor!
=0)
strcpy(author,pAuthor);
press=newchar[strlen(pPress)+1];
if(pPress!
=0)
strcpy(press,pPress);
numberOfpages=pNumberOfPages;
//Book带所有成员数据的构造函数的实现
}
inlinevoidBook:
:
printBook()
{cout<<"name"<//Book内联成员函数printBook的实现
}
voidBook:
:
setPress(constchar*pPress="清华大学出版社")
{press=newchar[strlen(pPress)+1];
if(pPress!
=0)
strcpy(press,pPress);
//Book成员函数setPress的实现
}
Book:
:
~Book()
{
delete[]name;
delete[]author;
delete[]press;
}
intmain()
{
Bookbk("微机原理与接口技术","姚琳","高等教育出版社",271);
bk.printBook();
bk.setPress();
bk.printBook();
return0;
}⑸运行结果
⑹思考题及问题
考虑如何将内联成员函数setPress实现为另外一种形式(不使用关键字inline)?
2.实验10自测题3
⑴定义一个工程师类Engineer,其成员数据包括编号id、姓名name和职称position,实现一个打印自身信息的成员函数printEngineer(),定义一个包含4个工程师对象的对象数组,并使用new运算符申请两个匿名对象。
调用printEngineer()打印所有对象的信息。
⑵要求
给出Engineer类的构造函数和析构函数
⑶思路
参考实验10练习题3及教材中“对象数组和对象指针”的相关代码
⑷将下面程序代码补充完整,并运行
#include//包含头文件iostream
usingnamespacestd;//使用命名空间std
classEngineer
{public:
Engineer(){};
Engineer(intpId,char*pName,char*pPosition);
voidsetEngineer(intpId,char*pName,char*pPosition);
~Engineer();
voidprintEngineer();
private:
intid;
char*name;
char*position;
//类Engineer的定义
};
Engineer:
:
Engineer(intpId,char*pName,char*pPosition)
{id=pId;
name=newchar[strlen(pName)+1];
if(pName!
=0)strcpy(name,pName);
position=newchar[strlen(pPosition)+1];
if(pPosition!
=0)strcpy(position,pPosition);
//Engineer的构造函数的实现
}
voidEngineer:
:
setEngineer(intpId,char*pName,char*pPosition)
{id=pId;
name=newchar[strlen(pName)+1];
if(pName!
=0)
strcpy(name,pName);
position=newchar[strlen(pPosition)+1];
if(pPosition!
=0)
strcpy(position,pPosition);
//Engineer的成员函数setEngineer的实现
}
Engineer:
:
~Engineer()
{
delete[]name;
delete[]position;//Engineer的析构函数的实现
}
voidEngineer:
:
printEngineer()
{cout<<"id"<//Engineer的成员函数prinEngineer的实现
}
intmain()
{
Engineere[4];
e[0].setEngineer(1001,"王含","讲师");
e[1].setEngineer(1002,"张青","讲师");
e[2].setEngineer(1003,"赵菁","副教授");
e[3].setEngineer(1004,"姚琳","教授");
Engineer*pE1=newEngineer(1005,"方伟","副教授");
Engineer*pE2=newEngineer(1006,"黄玲","教授");
e[0].printEngineer();
e[1].printEngineer();
e[2].printEngineer();
e[3].printEngineer();
pE1->printEngineer();
pE2->printEngineer();
deletepE1,pE2;
return0;
}
⑸运行结果
⑹思考题及问题
删除Engineer()构造函数,程序是否还能正常运行?
删除deletepE1,pE2;语句,会造成什么后果?
程序运行的结果又是什么?
3.实验10自测题4
⑴定义一个计算机类Computer,其成员数据包括计算机编号id、品牌brand、主频mainFrequency和硬盘大小hardDisk,实现一个打印自身信息的成员函数printComputer()。
定义默认构造函数、带所有成员数据的构造函数和拷贝构造函数。
设某单位有5个品牌都是“IBM”的计算机,使用带所有成员数据的构造函数生成一个计算机对象,使用拷贝构造函数生成另外4个汽车对象,并通过调用修改编号、主频和硬盘大小的成员函数进行相应调整。
最后调用printComputer()打印所有计算机对象的信息。
⑵要求
给出Computer类的拷贝构造函数和析构函数
⑶思路
参考教材中“拷贝构造函数”的相关代码
⑷将下面程序代码补充完整,并运行
#include//包含头文件iostream
usingnamespacestd;//使用命名空间std
classComputer
{public:
Computer();
Computer(intpId,constchar*pBrand,floatpMainFrequency,floatpHardDisk);
Computer(Computer&Cp);
~Computer();
voidprintComputer();
voidsetId(intpId);
voidsetMainFrequency(floatpMainFrequency);
voidsetHardDisk(floatpHardDisk);
private:
intid;
char*brand;
floatmainFrequency;
floathardDisk;
//Computer类的定义
};
Computer:
:
Computer()
{
cout<<"Constructedwithoutanyparameter."<}
Computer:
:
Computer(intpId,constchar*pBrand,floatpMainFrequency,floatpHardDisk)
{id=pId;
brand=newchar[strlen(pBrand)+1];
if(pBrand!
=0)
strcpy(brand,pBrand);
mainFrequency=pMainFrequency;
hardDisk=pHardDisk;
//Computer带参数的构造函数实现
cout<<"Constructedwithallparameters."<}
Computer:
:
Computer(Computer&Cp)
{
id=Cp.id;
brand=newchar[strlen(Cp.brand)+1];
if(Cp.brand!
=0)
strcpy(brand,Cp.brand);
mainFrequency=Cp.mainFrequency;
hardDisk=Cp.hardDisk;
//Computer拷贝构造函数的实现
cout<<"CopyConstucted."<}
Computer:
:
~Computer()
{
delete[]brand;
cout<<"Deconstructed."<}
voidComputer:
:
printComputer()
{
cout<<"id:
"<<<"brand:
"<<<"mainFrequency:
"<<<"hardDisk:
"<}
voidComputer:
:
setId(intpId)
{
id=pId;
}
voidComputer:
:
setMainFrequency(floatpMainFrequency)
{mainFrequency=pMainFrequency;
//设置主频值
}
voidComputer:
:
setHardDisk(floatpHardDisk)
{hardDisk=pHardDisk;
//设置硬盘大小
}
intmain()
{
Computercomputer1(1001,"IBM",1.8f,500.f);
Computercomputer2=computer1;
computer2.setId(1002);
computer2.setMainFrequency(2.f);
computer2.setHardDisk(1000.f);
Computercomputer3=computer1;
computer3.setId(1003);
computer3.setMainFrequency(2.5f);
computer3.setHardDisk(1500.f);
Computercomputer4=computer1;
computer4.setId(1004);
computer4.setMainFrequency(2.f);
computer4.setHardDisk(1200.f);
computer1.printComputer();
computer2.printComputer();
computer3.printComputer();
computer3.printComputer();
computer4.printComputer();
return0;
}⑸运行结果
⑹思考题及问题
删除拷贝构造函数,程序还是否能够正常运行?
4.编程题
⑴题目:
创建一个名为Account的类,银行可以使用它表示客户的银行帐户。
这个类应该包括一个类型为double的数据成员,表示帐户余额。
这个类必须提供一个构造函数,它接受初始余额并用它初始化数据成员。
这个构造函数应当确认初始余额的有效性,保证它大于或等于0.否则,余额应当设置为0,并且构造函数必须显示一条错误信息,指出初始余额是无效的。
该类还要提供三个成员函数。
成员函数credit将一笔金额加到当前余额中。
debit将从这个Account中取钱,并保证取出金额不超过此Account的余额。
如果不是这样,余额不变,函数打印一条信息,指出“Debitamountexceededaccountbalace.”。
成员函数getBalance将返回当前余额。
⑵要求:
根据题目要求,写出类和应用程序的设计思路和程序代码。
⑶思路:
1类设计:
创建一个名为Account的类,包括一个类型为double的数据成员money,表示帐户余额,余额初始化为0。
构造函数Account()credit()
2应用程序设计:
(主函数中,定义对象及调用对象的成员函数)
⑷程序代码:
#include
usingnamespacestd;
classaccount
{public:
account()
{
id=1;
money=10000000;
}
account(intPId,doublePMoney);
voidcredit(doublePMoney);
voiddebit(doublePMoney);
voidprintAccount();
voidgetBalance(doublePMoney);
private:
intid;
doublemoney;
};
account:
:
account(intPId,doublePMoney)
{
id=PId;
if(PMoney>0)
money=PMoney;
else
{cout<<"余额初始化失败了哦"<money=0;}
}
voidaccount:
:
credit(doublePMoney)
{money=money+PMoney;}
voidaccount:
:
debit(doublePMoney)
{money=money-PMoney;
if(money<0)
{
getBalance(PMoney);
cout<<"Debitamountexceededaccountbalace."<}
}
voidaccount:
:
getBalance(doublePMoney)
{
money=money+PMoney;
}
voidaccount:
:
printAccount()
{cout<<"id"<}
intmain()
{accounta(1,100);
a.printAccount();
a.debit(100);
a.printAccount();
accountaa(2,200);
aa.printAccount();
aa.credit(200);
aa.printAccount();
accountaaa(3,300);
aaa.printAccount();
aaa.printAccount();
return0;
}
⑸运行结果