您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > c++程序设计B实验 类与对象
实验类型验证实验学时4一、实验目的和要求1.掌握类的定义以及类成员函数的定义和调用;2.掌握构造函数和析构函数的定义及使用3.掌握类对象、对象指针、对象数组的定义和使用;二、实验环境(实验设备)联想电脑VisualStudioC++6.0三、实验内容及过程1.定义学生类Student,用于存放并输出学生的姓名、学号、年龄、程序设计的成绩。1)定义缺省构造函数、带参数的构造函数和拷贝构造函数给学生的姓名、学号、年龄、程序设计的成绩分配内存并赋值;2)定义函数输出学生信息;3)定义析构函数;4)在主函数中定义多个对象并调用上述成员函数进行测试。实验解答:#includeiostream#includeiomanipusingnamespacestd;classStudent{private:char*name;char*no;intage;floatscore;public:Student(){name=NULL;no=NULL;age=0;score=0.0;}2Student(charname1[20],charno1[16],intage1,floatscore1){if(name1){name=newchar[strlen(name1)+1];strcpy(name,name1);}elsename=NULL;if(no1){no=newchar[strlen(no1)+1];strcpy(no,no1);}elseno=NULL;age=age1;score=score1;}Student(constStudent&s){if(s.name){name=newchar[strlen(s.name)+1];strcpy(name,s.name);}elsename=NULL;if(s.no){no=newchar[strlen(s.no)+1];strcpy(no,s.no);}elseno=NULL;age=s.age;score=s.score;}voidoutput(){cout学生学号:no姓名:name年龄:age程序设计成绩:scoreendl;}~Student(){delete[]name;3delete[]no;cout调用了析构函数!endl;}};intmain(){Students(安迪,3120160905601,17,100);cout学生信息显示:endl;s.output();coutendl;Studentc=s;cout学生信息显示:endl;c.output();cout欢迎下次使用!endl;system(pause);return0;}2.定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。实验解答:①码如下:程序的运行结果是:#includeiostream#includeiomanipusingnamespacestd;classTime{private:intHour;intMinute;intSecond;public:Time(){Hour=Minute=Second=0;}Time(intx,inty,intz){if(x24&&x0){Hour=0;}4elseHour=x;if(y60&&y0){Minute=0;}elseMinute=y;if(z60&&z0){Second=0;}elseSecond=z;}voidsetTime(intx,inty,intz){if(x24&&x0){Hour=0;}elseHour=x;if(y60&&y0){Minute=0;}elseMinute=y;if(z60&&z0){Second=0;}elseSecond=z;}voidinput(){cout请输入时间:;cinHourMinuteSecond;}voidoutput(){cout时间:Hour时Minute分Second秒endl;}~Time(){cout调用了析构函数!endl;}};intmain(){Times;cout时间信息初始化:endl;s.output();coutendl;s.input();cout时间信息显示:endl;s.output();coutendl;s.setTime(22,12,03);cout修改信息显示:endl;s.output();cout欢迎下次使用!endl;5system(pause);return0;}构造函数与析构函数的调用方式及执行顺序是:构造函数:在主函数中先定义的对象,先调用。析构函数:在主函数中后定义的对象,先调用。②不改变main()函数中的对象的定义方式,若取消构造函数中参数的默认值,请在小结中记录编译程序错误提示信息并解释原因。提示:没有合适的默认构造函数可用原因:系统是通过所给的初值个数决定调用哪一个重载函数的构造函数,现在取消构造函数中参数的默认值,就没有合适的构造函数调用了。②果删除类中自定义的构造函数,仅使用系统默认构造函数,再编译,请在小结中记录程序错误提示信息并解释原因。提示:系统不会报错,但是会生成无意义数值原因:没有相应的默认值,系统会随机参数特别大的垃圾数值。④恢复成①的正确状态,如果将main()函数中的输出语句改为:cout对象名.Hour:对象名.Minute:对象名.Secondendl;重新编译,会出现什么错误提示?请在小结中记录程序错误提示信息并解释原因。在这种情况下,如果将成员变量的访问属性修改为public再编译,结果如何?错误提示:成员Time::Hour不可访问。原因:Hour,Minute,Second是Time的私有成员,在类外不可直接访问。修改后:可以编译,和使用成员函数输出效果相同。⑤在类中增加voidIncreaceOneSecond();函数,将时间调快1秒,完整代码是:6voidIncreaceOneSecond(){if(Second==59){Second=0;if(Minute==59){Minute=0;if(Hour==24)Hour=1;elseHour++;}elseMinute++;}elseSecond++;}⑥主函数中定义一个Time类对象并调用一次f函数,观察结果填写下表:f函数的原型主函数中调用f的语句构造函数调用次数拷贝构造函数调用次数析构函数调用次数voidf(Timet);t.f(t)112voidf(Time&t);t.f(t)101voidf(Time*t);t.f(&t)101通过以上结果,关于对象作形式参数、对象引用作形式参数、对象指针作形式参数时构造函数、析构函数的调用次数及顺序,你得到什么结论?对象作形式参数,需要将原本的对象拷贝给形式参数,所以调用拷贝函数一次,形式参数执行完命令后,调用一次析构函数,主函数执行完后再调用一次析构函数。对象指针,对象引用作参数,已经是同一个对象了,不需要将原本的对象拷贝给形式参数,所以主函数执行完命令后只调用一次析构函数。3.定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。7实验解答:①义相应的类,主函数中定义相应的类成员,调用各类的输出函数显示信息。源程序代码如下:#includeiostreamusingnamespacestd;classGirl{private:char*name;intage;public:Girl();Girl(int,char*);~Girl();voidoutput();};Girl::Girl(){name=NULL;age=0;}Girl::Girl(intx,char*name1){if(name1){name=newchar[strlen(name1)+1];strcpy(name,name1);}age=x;}Girl::~Girl(){delete[]name;cout调用了析构函数!endl;}voidGirl::output(){cout女生姓名为:name年龄:ageendl;}classBoy8{private:char*name;intage;public:Boy();Boy(int,char*);~Boy();voidoutput();};Boy::Boy(){name=NULL;age=0;}Boy::Boy(intx,char*name1){if(name1){name=newchar[strlen(name1)+1];strcpy(name,name1);}age=x;}Boy::~Boy(){delete[]name;cout调用了析构函数!endl;}voidBoy::output(){cout男生姓名为:name年龄:ageendl;}intmain(){Boyb(19,张强);Girlg(17,林惊蛰);b.output();g.output();cout欢迎下次使用!endl;system(pause);return0;}9程序的运行结果是:②Girl类作为Boy类的友元类,写出Girl类的成员函数VisitBoy(Boy&)的实现代码。#includeiostreamusingnamespacestd;classGirl;classBoy{private:char*name;intage;public:friendGirl;Boy(intx,char*name1){if(name1){name=newchar[strlen(name1)+1];strcpy(name,name1);}age=x;}voidoutput(){cout男生姓名为:name年龄:ageendl;}};classGirl{private:char*name;intage;10public:Girl(intx,char*name1){if(name1){name=newchar[strlen(name1)+1];strcpy(name,name1);}age=x;}voidoutput(){cout女生姓名为:name年龄:ageendl;}voidVisitBoy(Boy&m){Boyb(12,李强);b.output();b.age=m.age;strcpy(b.name,m.name);b.output();}};intmain(){Boyb(19,张强);Girlg(17,林惊蛰);b.output();g.output();cout调用友元类:endl;g.VisitBoy(b);cout欢迎下次使用!endl;system(pause);return0;}③在Boy类的某成员函数VisitGirl(Girl&)中试图访问Girl类的私有成员,记录编译器给出的错误信息,与②对比,你能得出友元的什么特性?11提示:Girl::name,Girl::age不可访问其他类可以作为友元类访问类中私有成员,修改私有成员;但是由于其他类成员函数就不能修改类中私有成员。④在上面代码的基础上,在Girl类的定义中,增加一行代码:friendBoy;在主函数中通过Boy类对象.VisitGirl(Girl类对象)的形式输出Girl类对象的信息。编译的结果是?写出这一步你的主函数代码,要求分别用友元函数Girl类对象.VisitBoy(Boy类对象);和Boy类对象
本文标题:c++程序设计B实验 类与对象
链接地址:https://www.777doc.com/doc-4220619 .html