面向对象程序的设计实验报告Word格式文档下载.docx
- 文档编号:20200438
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:33
- 大小:201.51KB
面向对象程序的设计实验报告Word格式文档下载.docx
《面向对象程序的设计实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《面向对象程序的设计实验报告Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
处的输出结果为什么是d2=12,而不是d2=12.3?
因为调用的intmax_def(intx,inty,intz)函数返回值为整型。
2.理解下面的程序并运行,然后回答问题。
#includeintmain()int*p1=newint;
-int*p2=newint(0);
-char*p3=newchar10;
、处动态申请存分别代表什么意思?
处:
定义一个整型指针动态分配一个整型空间将首地址赋给p1;
定义一个整型指针动态分配一个整型空间,并赋值为0;
定义一个字符型指针动态分配具有10个数组元素的字符数组空间,将首地址赋给p3。
问题二:
该程序存在什么不合理的地方?
程序结束时没有释放分配的存储空间。
3.理解下面的程序并运行,然后回答问题。
#includevoidswap(inta,intb)inttemp=a;
a=b;
b=temp;
voidswap(int*a,int*b)inttemp=*a;
*a=*b;
*b=temp;
intmain()inti=5;
intj=10;
coutBeforeswap:
i=i,j=jendl;
swap(i,j);
coutAfterthefirstswap:
swap(&
i,&
j);
coutAfterthesecondswap:
return1;
输出结果是什么?
处函数调用不能实现两个数的交换,而可以,原因是什么?
处调用的函数形参为整型变量,是值传递,形参的改变不影响实参;
处调用的函数形参为指针,是址传递,形参的改变会导致实参的改变。
问题三:
调用的函数是voidswap(int*a,int*b)。
实验二类和对象类的构建2.1实验目的1.类的定义;
2.类对象的使用;
3.类成员变量的定义和使用;
4.类成员函数的定义和使用;
5.理解类的作用域;
6.理解类的声明;
7.理解类中成员的访问属性;
2.2实验容2.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题。
#includeclassCDatepublic:
voidSet(intm,intd,inty)month=m;
day=d;
year=y;
intIsLeapYear()return(year%4=0&
year%100!
=0)|(year%400=0);
voidPrint()coutmonth/day/yearendl;
private:
intmonth;
intday;
intyear;
voidmain()CDatea;
a.Set(10,15,2007);
a.Print();
以上程序为什么不能通过编译?
如何改正?
因为Set函数被设为私有main函数中无法调用,应在set函数前加public。
类中的成员函数和成员变量分别属于哪种访问权限?
数据成员为私有,Print为公有;
set原为私有,改正后为公有。
处语句的意思是什么?
将类定义一个对象a。
.#includeintmonth;
/全局变量intday;
voidSet(intm,intd,inty):
month=m;
:
classCDatepublic:
Set(m,d,y);
问题一:
处是在给成员变量赋值还是全局变量赋值,如果去掉域作用符:
,程序是否还能正确运行?
全局变量,不能。
处调用的哪个函数,如果去掉域作用符:
调用全局set函数;
不能。
程序的输出结果是?
实验三类和对象构造函数与析构函数3.1实验目的1.理解this指针的作用和用法;
2.掌握构造函数的定义和作用;
3.掌握构造函数的使用;
4.掌握拷贝构造函数的定义和使用;
5.掌握构造函数的重载;
6.掌握析构函数的定义和使用。
3.2实验容3.2.1程序阅读1.理解下面的程序并运行,然后回答问题。
#includeclassCPointpublic:
voidSet(intx,inty);
voidPrint();
intx;
inty;
voidCPoint:
Set(intx,inty)x=x;
y=y;
Print()coutx=x,y=yendl;
voidmain()CPointpt;
pt.Set(10,20);
pt.Print();
以上程序编译能通过吗?
如果不能,原因是什么?
能通过编译。
以上程序的运行结构是否正确,如果不正确,分析为什么,如何改正?
运行结构不正确,因为Set函数中,x=x,参数x覆盖数据成员,使得数据成员并没有被赋值。
2.理解下面的程序并运行,然后回答后面的问题。
includeclassCPersonpublic:
CPerson();
intage;
char*name;
CPerson:
CPerson()voidCPerson:
Print()coutname=name,age=ageendl;
voidmain()CPersonps(23,三);
ps.Print();
以上程序存在三个错误,在不改变主函数容的前提下,试改正该程序。
第一处错误是:
在程序头应添加#include文件,第二处错误是:
构造函数没有参数,应添加为(inti,charj),第三处错误是:
构造函数没有函数体。
改正后的程序为:
#include#includeclassCPersonpublic:
CPerson(inti,char*j);
public:
CPerson(inti,char*j)age=i;
name=j;
voidCPerson:
实验四类和对象对象传递与静态成员4.1实验目的1.静态成员(静态数据成员、静态成员函数)的作用与使用时的注意事项2.掌友元(友元函数、友元类)的作用和使用;
3.理解常类型。
4.2实验容4.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题。
#include#includeclassCStudentpublic:
CStudent(char*n,inta);
CStudent();
staticvoidSetAge(intage);
staticintnTotalObj;
intCStudent:
nTotalObj=0;
CStudent:
CStudent(char*n,inta):
age(a)intnLcn=strlen(n);
name=newcharnLen+1;
strcpy(name,n);
namenLen=0;
nTotalObj+;
CStudent()deletename;
nTotalObj-;
voidCStudent:
SetAge(intage)this-age=age;
voidmain()CStudentstu1(三,25);
CStudentstr2(四,26);
coutCStudent:
nTotalObj=CStudent:
nTotalObjendl;
以上程序编译能通过吗,为什么?
不能,CStudent:
nTotalObj为私有变量,类引不能访问。
成员变量nTotalObj起什么作用,它是如何实现的?
统计该类所创建对象的个数,通过声明为静态。
如果不改编主函数和类Cstudent中的成员变量的属性,应该如何改正该程序?
可以将staticintnTotalObj声明为公有。
age(a)intnLen=strlen(n);
classCTeacherpublic:
CTeacher(char*tn,intta);
CTeacher();
voidSetStuAge(inta);
CStudentstu;
CTeacher:
CTeacher(char*tn,intta):
age(ta)intnLen=strlen(tn);
strcpy(name,tn);
CTeacher()deletename;
voidCTeacher:
SetStuAge(inta)stu.age=a;
以上程序有两个错误,指出并改正。
第一处错误是Cstudentage为私有,Cteacher无法访问。
第二处错误是Cteacher中Cstudent未初始化。
改正:
intageCteacher:
Cteacher(char*tn,intta):
age(ta),stu(tn,ta)3.理解下面的程序并运行,然后回答后面的问题。
#includeclassDateprivate:
constintyear;
constintmonth;
constintday;
Date(inty,intm,intd);
voidshowdate();
Date:
Date(inty,intm,intd)year=y;
voidDate:
showdate()coutyear/month/dayendl;
voidmain()constDateobj(2007,10,30);
obj.showdate();
以上程序有两个错误,试指出来,并改正之?
构造函数应该用成员初始化列表对常数据成员初始化;
第二处错误是:
没有用常成员函数访问常对象数据成员。
#includeusingnamespacestd;
classDateprivate:
voidshowdate()const;
Date(inty,intm,intd):
year(y),month(m),day(d)voidDate:
showdate()constcoutyear/month/dayendl;
voidmain()Dateobj(2007,10,30);
实验五派生与继承单基派生5.1实验目的1.理解继承的概念;
2理解共有派生、私有派生和保护派生;
3.理解单基派生类中构造函数和析构函数的执行顺序。
5.2实验容5.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题。
#includeclassCBasepublic:
CBase(inta):
a(a)protected:
voidprint()couta=aendl;
inta;
classCDerive:
publicCBasepublic:
voidprint()CBase:
print();
coutb=bendl;
intb;
voidmain()CDerived;
d.print();
CBaseb;
b.print();
以上程序有两个错误,试指出来,并改正之。
类CBase中的成员数据应该为公有访问属性,第二个错误是构造函数有问题。
改正后的程序有两种:
classCBasepublic:
a(a)Voidprint()couta=aendl;
CDerive(inta,intb):
CBase(a),b(b)voidprint()CBase:
voidmain()CDerived(6,4);
CBaseb(5);
#includeiostream.hclassCBasepublic:
a(a)coutbasestructureendl;
CBase()coutbasedestructureendl;
protected:
CDerive(inta,intb,intc):
CBase(a),b(b),c(c)coutdervicestructureendl;
CDerive()coutderivedestructureendl;
coutb.a=b.aendl;
coutc=cendl;
intc;
voidmain()CDerived(1,2,3);
以上程序的输出结果是什么,为什么?
输出结果是原因是基类和派生类中构造函数和析构函数的执行顺序。
处语句执行完后,d.b.a的值为多少?
值为1。
实验六派生与继承多基派生6.1实验目的1.理解多基派生的定义;
2.基派生中的构造函数与析构函数的调用顺序;
3.理解多基派生中虚基类的作用。
6.2实验容6.2.1程序阅读1.理解下面的程序并运行,然后回答后面的问题。
classCBase1public:
CBase1(inta):
a(a)coutbase1structure.endl;
CBase1()coutbase1destructure.endl;
classCBase2public:
CBase2(intb):
b(b)coutbase2structure.endl;
CBase2()coutbase2destructure.endl;
voidprint()coutb=bendl;
publicCBase1,publicCBase2public:
CDerive()coutderivestructure.endl;
CDerive()coutderivedestructure.endl;
voidprint()CBase1:
CBase2:
b1.print();
b2.print();
CBase1b1;
CBase2b2;
改正以上程序中的错误,并分析输出结果。
CBase1与CBase2没有合适的构造函数,改正方法在CBase1,CBase2设置缺省值为0改正:
将CDerive构造函数改为:
CBase1(a),CBase2(b),b1(a),b2(b),c(c)coutderivestructure.endl;
主函数中CDerived;
改为CDerived(1,2,3);
输出结果是:
实验七多态性函数与运算符的重载7.1实验目的1.理解静态联编和动态联编的概念;
2.掌握成员函数方式运算符重载;
3.掌握友元函数方式运算符重载;
4.掌握+、-、=运算符的重载。
7.2实验容1.理解下面的程序并运行,然后回答后面的问题。
#includeiostream.hclassCComplexpublic:
CComplex()real=0;
imag=0;
CComplex(intx,inty)real=x;
imag-y;
intreal;
intimag;
CComplexoperator+(CComplexobj1)CComplexobj2(real+obj1.real,imag+obj1.imag);
returnobj2;
voidmain()CComplexobj1(100,30);
CComplexobj2(20,30);
CComplexobj;
obj=obj1+obj2;
coutobj.realendl;
coutobj.imagendl;
处的运算符重载,为什么该函数的返回值要设计成Ccomplex类型?
处运算符重载,要返回两个值real和imag,所以函数返回值类型设计为CComplex类型。
处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);
”,请问CComplex类中的运算符重载函数为什么只有一个参数?
因为调用重载运算符的对象本身相当于一个参数。
课后习题第二章一实验目的1.掌握引用的使用。
2.掌握调用函数的方法。
二实验容2.19写出下列程序的运行结果。
voidf(int&
m,intn)inttemp;
temp=m;
m=n;
n=temp;
Intmain()inta=5,b=10;
f(a,b)couta”bendl;
return0;
三实验结果四心得体会1.引用可以作为函数形参,和指针变量作为函数参数效果一样,但是引用作为函数参数更清晰。
2.第三章一实验目的1.掌握静态数据成员的使用。
2.掌握静态成员函数的使用。
二实验容3.26写出下列程序的运行结果。
ClassMintA;
staticintB;
M(inta)A=a;
B+=a;
cout”Constructingn”endl;
Staticvoidf1(Mm);
M()cout”Destructingn”endl;
VoidM:
f1(Mm)Cout”A=”m.Aendl;
Cout”B=”bendl;
intM:
B=0;
intmain()MP(5),Q(10);
M:
f1(P);
f1(Q);
Return0;
三实验结果四心得体会1.静态数据成员主要用作类的所有对象所公用的数据,它在类的任何对象建立前就存在了。
2.一般情况下,静态成员函数来访问静态数据成员。
第四章一实验目的1.掌握派生类的继承方式。
2.掌握派生类构造函数和析构函数。
3.掌握派生类构造函数和析构函数的执行顺序。
二实验容4.15写出下列程序的运行结果。
classB1intb1;
B1(inti)b1=i;
cout”constructorB1.”iendl;
Voidprint()coutb1endl;
classB2intb2;
B2(inti)B2=i;
cout”constructorB2.”iendl;
Voidprint()coutb2endl;
classB3intb3;
B3(inti)B3=i;
cout”constructorB3.”iendl;
intgetb3()returnb3;
classA:
publicB2,publicB1inta;
B3bb;
A(inti,intj,intk,intl):
B1(i),B2(j),bb(k)a=1;
cout”constructorA.”endl;
voidprint()B1:
B2:
couta”,”bb.getb3()endl;
intmain()Aaa(1,2,3,4);
aa.print();
三实验结果四心得体会1.派生类继承了基类的成员,实现了原有代码的重用,但是基类的构造函数和析构函数不能被继承,对所有从基类继承下来的成员初始化工作还是由基类构造函数完成,但是我们必须在派生类中对基类的构造函数所需要的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序 设计 实验 报告