您好,欢迎访问三七文档
暨南大学本科实验报告专用纸课程名称《C++程序设计实验》成绩评定实验项目名称类与对象指导教师实验项目编号08060270103实验项目类型设计实验地点C305学生姓名学号学院电气信息学院系专业电气工程及其自动化实验时间2016年9月15日晚上温度℃湿度一、实验目的●掌握类的定义,构造函数、析构函数和终结器的使用。●掌握类库的创建及调用。●掌握类的成员属性定义及使用。二、实验环境P4计算机一台,Windows7操作系统,MicrosoftVisualC++2013编程环境。三、实验内容及分析(一)类的定义1.题意描述构造并完善这个类的定义及实现。2.最终实现的程序(需添加注释)#includestdafx.husingnamespaceSystem;refclassCTest//定义引用类CTest{private://私有成员变量intx,y,result;public://公有函数voidinit(inta,intb){x=a;y=b;result=x-y;}voidprint(void){Console::WriteLine(L{0}-{1}={2}\n,x,y,result);}};intmain(arraySystem::String^^args)暨南大学本科实验报告专用纸(附页)2{CTest^c=gcnewCTest;//定义CTest类指针c-init(200,60);//调用类c的init函数c-print();//调用类c的print函数return0;}3.回答问题1).在定义类时,其数据成员的变量命名对主函数有影响吗,为什么?答:无影响。类数据成员变量名为private成员,不在类外被调用2)指出构造函数和析构函数分别是在什么时候被调用的?答:构造函数:系统在生成类的对象时自动调用析构函数:对象所在的函数已调用完毕3)成员函数定义体放在类内与放在类外有何区别?答:当类的成员函数的函数体在类的外部定义时,必须由作用域运算符“::”来通知编译系统该函数所属的类。4).如果定义了一个有参的构造函数,程序运行会出现什么问题(分别测试数值类和引用类),为什么?答:默认的无参构造函数使得值类中每个成员的数据初始化为0,所有句柄成员初始化为nullptr.。有参构造函数使值类种的成员初始化为相应的数据。(二)立方体1.题意描述在所给程序基础上,增加相应的构造函数,析构函数和终结器,通过运行结果显示出这些函数被何时调用,他们之间的顺序如何。2.程序实现及注释#includestdafx.h#includestdlib.husingnamespaceSystem;refclassCube{private:暨南大学本科实验报告专用纸(附页)3doubleLength,Heigt,Width,Volume;//长,高,宽和体积public:Cube():Length(0),Width(0),Heigt(0)//显式默认构造函数{Volume=Length*Width*Heigt;Console::WriteLine(L默认构造函数被调用,体积为:{0},Volume);}Cube(doublel,doublew,doubleh):Length(l),Width(w),Heigt(h){Volume=Length*Width*Heigt;Console::WriteLine(L有参构造函数被调用,体积为:{0},Volume);}~Cube(){Console::WriteLine(L析构函数被调用);}voidShowRes(void){Console::WriteLine(这个立方体的体积为:{0},Volume);}};intmain(arraySystem::String^^args){Cube^cube1=gcnewCube;//调用无参构造函数Cube^cube2=gcnewCube(4,5,6);//调用有参构造函数cube2-ShowRes();return0;}3.回答问题1).在主函数中增加Cube类的对象(不是跟踪句柄,如Cubea,b(2,3,4);),观察运行结果。答:intmain(arraySystem::String^^args){//Cube^cube1=gcnewCube;//调用无参构造函数//Cube^cube2=gcnewCube(4,5,6);//调用有参构造函数暨南大学本科实验报告专用纸(附页)4Cubea(4,5,6);//cube2-ShowRes();a.ShowRes();return0;}结果同原程序2).增加一个两个参数的构造函数(长,宽),计算和输出它的面积。在主函数中增加定义两个参数的对象和跟踪句柄,观察运行结果。答:3).在类中定义一个拷贝构造函数,在主函数中定义新的对象和跟踪句柄,并输出它的体积。Cube^cube3=gcnewCube(cube2);Cube^cube4=gcnewCube(*cube2);Cubecube5(cube2);Cube^cube6=gcnewCube(b);Cubecube7(b);4).增加相应的析构函数和终结器函数,观察这些函数(构造函数、拷贝构造函数、析构函数和终结器函数)分别是在什么时候被调用的?(在命令提示符下运行)答:构造函数:系统在生成类的对象时自动调用拷贝构造函数:用定义对象初始化新对象时析构函数:对象所在的函数已调用完毕终结器函数:销毁对应引用类对象时5)在主函数的结尾增加deletecube1;后,运行结果有何变化?答:调用析构函数,输出“析构函数被调用”暨南大学本科实验报告专用纸(附页)56).如果定义立方体的密度为p=0.9,请用字面值字段literal定义这个参数,然后再增加一个计算和输出质量的ShowQua()函数,在主函数中增加调用这个函数输出某个立方体的质量。答:7).修改类中的数据成员Height为只读字段(initonlydoubleHeight;)运行结果有何变化?为什么?答:第一次定义cube1后,Height的值不变,因为Height被initonly修饰,在调用构造函数时被定义并初始化,之后为静态,不可重新赋值(三)标量属性1.题意描述利用所给程序,修改和测试属性的定义及使用。2.实现的程序及注释说明#includestdafx.husingnamespaceSystem;refclassStud{intno,deg;System::String^name;public:staticintsum;staticintnum;//静态属性public:Stud(intn,System::String^na,intd){no=n;deg=d;name=na;sum+=d;num++;}~Stud(){sum-=deg;num--;}staticdoubleavg(){returnsum/num;}暨南大学本科实验报告专用纸(附页)6voiddisp(){Console::WriteLine(L{0,-5}{1,-8}{2,3},no,name,deg);}propertydoubleScore{doubleget(){returndeg;}voidset(doubled){deg=d;if(d0)deg=0;if(d100)deg=100;}}propertyintheight;//身高propertydoubleweight;//体重};intmain(arraySystem::String^^args){Studs1(1,李四,89),s2(2,陈可,78),s3(3,张半,96);Stud^s4=gcnewStud(4,王五,90);Console::WriteLine(L学号姓名成绩);s1.disp();s2.disp();s3.disp();s4-disp();Console::WriteLine(L总分={0},人数={1},平均分={2},Stud::sum,s1.num,s4-avg());return0;}3.回答问题1).在主函数中增加语句:s2.Score=80;//A暨南大学本科实验报告专用纸(附页)7Console::Write(L学生{0}的分数为{1}:,s2.Score);//B试分析这两行语句分别调用什么函数。答:调用set();调用get()2).在主函数中增加语句:s4-Score=88;//CConsole::Write(L学生{0}的分数为{1}:,s4-Score);//Ddeletes4;Console::WriteLine(L总分={0},人数={1},平均分={2},Stud::sum,s1.num,s4-avg());试分析这些语句的作用和运行结果,特别是对静态数据成员和静态成员函数的影响。答:delete作用后,析构函数被调用,sum和num退回s4定义前的状态3).在类中增加两个简单属性(平凡标题属性)身高height和体重weight,则他们会使用默认的set和get函数。在主函数中增加语句:s2.height=170;s2.weight=60.5;Console::WriteLine(L身高={0},体重={1},s2.height,s2.weight);测试运行,分析运行结果,他们在什么地方调用默认的set和get函数?答:初始化赋值和调用输出时4).在main()函数中能否可输出学生的姓名(s1-name)和分数(s1-deg),为什么?答:不可以,s1非指针不可如此使用,且name和deg默认私有(四)索引属性1.题意描述下面的引用类使用了索引属性,课程名称(KCMC)使用的是默认索引属性,而KCCJ使用的是名称索引属性(有名索引属性)。在主函数中通过下标运算获取对应的值。2.实现的程序及注释说明#includestdafx.husingnamespaceSystem;refclassStud{intno;//学号System::String^name;//姓名arrayString^^KCMC;//课程名称arrayint^KCCJ;//课程成绩public:Stud(intn,String^na,intcj1,intcj2,intcj3,intcj4,intcj5)暨南大学本科实验报告专用纸(附页)8{no=n;name=na;KCMC=gcnewarrayString^{语文,数学,物理,化学,英语};KCCJ=gcnewarrayint(5);KCCJ[0]=cj1;KCCJ[1]=cj2;KCCJ[2]=cj3;KCCJ[3]=cj4;KCCJ[4]=cj5;}public:propertyString^default[int]{String^get(intindex){returnKCMC[index];}}propertyintCJ[int]{intget(intindex){returnKCCJ[index];}voidset(intindex,intdeg){KCCJ[index]=deg;}}voiddisp(){Console::WriteLine(L{0,-4}{1,-6}{2,5},{3,5},{4,5},{5,5},{6,5},no,name,CJ[0],CJ[1],CJ[2],CJ[3],CJ[4]);}};intmain(arraySystem::String^^args){Studs1(1,张三,60,70,80,90,87);Studs2(2,李四,65,75,85,95,96);Stud^s3=gcnewStud(3,王五,63,73,83,93,83);//修改属性值s1.CJ[0]=76;s3-CJ[0]=80;Console::WriteLine(L学号姓名{0,-4}{1,-4}{2,-4}{3,-4}{4,-4},s1[0],s1[1],s2[2],s3[3],s3[4]);s1.disp();暨南大
本文标题:C++CLI实验三
链接地址:https://www.777doc.com/doc-2901538 .html