2024年面向对象程序设计实验报告_第1页
2024年面向对象程序设计实验报告_第2页
2024年面向对象程序设计实验报告_第3页
2024年面向对象程序设计实验报告_第4页
2024年面向对象程序设计实验报告_第5页
已阅读5页,还剩58页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面对对象程序设计试验报告学生所在学院:信息科学与工程学院学生所在班级:学生姓名:指引教师:试验一C++基础1.1试验目标1.了解并熟悉开发环境,学会调试程序;2.熟悉C++中简单的标准输入输出函数的使用措施;3.了解const修饰符的作用并学会应用;4.了解内联函数的优缺陷并学会其使用场所;5.了解并学会函数重载;6.了解并纯熟掌握使用new和delete来分派内存;7.了解并纯熟掌握引用的使用措施。1.2试验内容1.2.1程序阅读1.了解下面的程序并运行,然后回答下列问题。#include<iostream.h>intmax_def(intx,inty){ return(x>y?x:y);}intmax_def(intx,inty,intz){ inttemp=0; return(temp=(x>y?x:y))>z?temp:z;}doublemax_def(doublex,doubley){ return(x>y?x:y);}intmain(){ intx1=0; intx2=0; doubled1=0.0; doubled2=0.0; x1=max_def(5,6); x2=max_def(2,3,4); d1=max_def(2.1,5.6); d2=max_def(12.3,3.4,7.8);-------------------------------------------------------① cout<<"x1="<<x1<<endl; cout<<"x2="<<x2<<endl; cout<<"d1="<<d1<<endl; cout<<"d2="<<d2<<endl;--------------------------------------------------------② return1;}问题一:上述程序的输出成果是什么?答:输出成果为问题二:①处调用的是哪个函数?答:①处调用的是doublemax_def(doublex,doubley)函数问题三:②处的输出成果为何是d2=12,而不是d2=12.3?答:因为调用的intmax_def(intx,inty,intz)函数返回值为整型。2.了解下面的程序并运行,然后回答下列问题。#include<iostream.h>intmain(){ int*p1=newint;------------------------------------------------------① int*p2=newint(0);-------------------------------------------------------② char*p3=newchar[10];----------------------------------------------------③ return1;}问题一:①、②、③处动态申请内存分别代表什么意思?答:①处:定义一个整型指针动态分派一个整型空间将首地址赋给p1;②处:定义一个整型指针动态分派一个整型空间,并赋值为0;③处:定义一个字符型指针动态分派具备10个数组元素的字符数组空间,将首地址赋给p3。问题二:该程序存在什么不合理的地方?答:程序结束时没有释放分派的存储空间。3.了解下面的程序并运行,然后回答下列问题。#include<iostream.h>voidswap(inta,intb){ inttemp=a; a=b; b=temp;}voidswap(int*a,int*b){ inttemp=*a; *a=*b; *b=temp;}intmain(){ inti=5; intj=10; cout<<"Beforeswap:i="<<i<<",j="<<j<<endl; swap(i,j); cout<<"Afterthefirstswap:i="<<i<<",j="<<j<<endl; swap(&i,&j); cout<<"Afterthesecondswap:i="<<i<<",j="<<j<<endl; return1;}问题一:输出成果是什么?答:问题二:①处函数调用不能实现两个数的互换,而②能够,原因是什么?答:①处调用的函数形参为整型变量,是值传递,形参的变化不影响实参;②处调用的函数形参为指针,是址传递,形参的变化会导致实参的变化。问题三:②处调用的是哪个函数?答:调用的函数是voidswap(int*a,int*b)。试验二类和对象——类的构建2.1试验目标1.类的定义;2.类对象的使用;3.类组员变量的定义和使用;4.类组员函数的定义和使用;5.了解类的作用域;6.了解类的申明;7.了解类中组员的访问属性;2.2试验内容2.2.1程序阅读1.了解下面的程序并运行,然后回答背面的问题。#include<iostream.h>classCDate{public: voidSet(intm,intd,inty) { month=m; day=d; year=y; } intIsLeapYear() { return(year%4==0&&year%100!=0)||(year%400==0); } voidPrint() { cout<<month<<"/"<<day<<"/"<<year<<endl; }private: intmonth; intday; intyear;};voidmain(){ CDatea; a.Set(10,15,); a.Print();}问题一:以上程序为何不能通过编译?怎样更正?答:因为Set函数被设为私有main函数中无法调用,应在set函数前加public。问题二:类中的组员函数和组员变量分别属于哪种访问权限?答:数据组员为私有,Print为公有;set原为私有,更正后为公有。问题三:①处语句的意思是什么?答:将类定义一个对象a。2.了解下面的程序并运行,然后回答下列问题。.#include<iostream.h>intmonth;//全局变量intday;intyear;voidSet(intm,intd,inty){ ::month=m; ::day=d; ::year=y;}classCDate{public: voidSet(intm,intd,inty) { ::Set(m,d,y); } voidPrint() { cout<<month<<"/"<<day<<"/"<<year<<endl; }private: intmonth; intday; intyear;};voidmain(){ CDatea; a.Set(10,15,); a.Print();}问题一:①处是在给组员变量赋值还是全局变量赋值,假如去掉域作用符::,程序是否还能正确运行?答:全局变量,不能。问题二:②处调用的哪个函数,假如去掉域作用符::,程序是否还能正确运行?答:调用全局set函数;不能。问题三:程序的输出成果是?答:试验三类和对象——结构函数与析构函数3.1试验目标1.了解this指针的作用和使用方法;2.掌握结构函数的定义和作用;3.掌握结构函数的使用;4.掌握拷贝结构函数的定义和使用;5.掌握结构函数的重载;6.掌握析构函数的定义和使用。3.2试验内容3.2.1程序阅读1.了解下面的程序并运行,然后回答下列问题。#include<iostream.h>classCPoint{public: voidSet(intx,inty); voidPrint();private: intx; inty;};voidCPoint::Set(intx,inty){ x=x; y=y;}voidCPoint::Print(){ cout<<"x="<<x<<",y="<<y<<endl;}voidmain(){ CPointpt; pt.Set(10,20); pt.Print();}问题一:以上程序编译能通过吗?假如不能,原因是什么?答:能通过编译。问题二:以上程序的运行结构是否正确,假如不正确,分析为何,怎样更正?答:运行结构不正确,因为Set函数中,x=x,参数x覆盖数据组员,使得数据组员并没有被赋值。2.了解下面的程序并运行,然后回答背面的问题。include<iostream.h>classCPerson{public: voidPrint();private: CPerson();private: intage; char*name;};CPerson::CPerson(){}voidCPerson::Print(){ cout<<"name="<<name<<",age="<<age<<endl;}voidmain(){ CPersonps(23,"张三"); ps.Print();}问题一:以上程序存在三个错误,在不变化主函数内容的前提下,试更正该程序。答:第一处错误是:在程序头应添加#include<string.h>文献,第二处错误是:结构函数没有参数,应添加为(inti,charj),第三处错误是:结构函数没有函数体。更正后的程序为:#include<iostream.h>#include<string.h>classCPerson{public: voidPrint(); CPerson(inti,char*j);public: intage; char*name;};CPerson::CPerson(inti,char*j){ age=i; name=j;}voidCPerson::Print(){ cout<<"name="<<name<<",age="<<age<<endl;}voidmain(){ CPersonps(23,"张三"); ps.Print();}试验四类和对象—对象传递与静态组员4.1试验目标1.静态组员(静态数据组员、静态组员函数)的作用与使用时的注意事项2.掌友元(友元函数、友元类)的作用和使用;3.了解常类型。4.2试验内容4.2.1程序阅读1.了解下面的程序并运行,然后回答背面的问题。#include<iostream.h>#include<string.h>classCStudent{public: CStudent(char*n,inta); ~CStudent(); staticvoidSetAge(intage);private: char*name; intage; staticintnTotalObj;};intCStudent::nTotalObj=0;CStudent::CStudent(char*n,inta):age(a){ intnLcn=strlen(n); name=newchar[nLen+1]; strcpy(name,n); name[nLen]='\0'; nTotalObj++;}CStudent::~CStudent(){ delete[]name; nTotalObj--;}voidCStudent::SetAge(intage){ this->age=age;}voidmain(){ CStudentstu1("张三",25); CStudentstr2("李四",26); cout<<"CStudent::nTotalObj="<<CStudent::nTotalObj<<endl;}问题一:以上程序编译能通过吗,为何?答:不能,CStudent::nTotalObj为私有变量,类引不能访问。问题二:组员变量nTotalObj起什么作用,它是怎样实现的?答:统计该类所创建对象的个数,通过申明为静态。问题三:假如不改编主函数和类Cstudent中的组员变量的属性,应当怎样更正该程序?答:能够将staticintnTotalObj申明为公有。2.了解下面的程序并运行,然后回答背面的问题。#include<iostream.h>#include<string.h>classCStudent{public: CStudent(char*n,inta); ~CStudent();private: char*name; intage;};CStudent::CStudent(char*n,inta):age(a){ intnLen=strlen(n); name=newchar[nLen+1]; strcpy(name,n); name[nLen]='\0';}CStudent::~CStudent(){ delete[]name;}classCTeacher{public: CTeacher(char*tn,intta); ~CTeacher(); voidSetStuAge(inta);private: char*name; intage; CStudentstu;};CTeacher::CTeacher(char*tn,intta):age(ta){ intnLen=strlen(tn); name=newchar[nLen+1]; strcpy(name,tn); name[nLen]='\0';}CTeacher::~CTeacher(){ delete[]name;}voidCTeacher::SetStuAge(inta){ stu.age=a;}voidmain(){ CStudentstu1("张三",25); CStudentstr2("李四",26);}问题一:以上程序有两个错误,指出并更正。答:第一处错误是Cstudentage为私有,Cteacher无法访问。第二处错误是Cteacher中Cstudent未初始化。更正:①public:intage②Cteacher::Cteacher(char*tn,intta)::age(ta),stu(tn,ta)3.了解下面的程序并运行,然后回答背面的问题。#include<iostream.h>classDate{private: constintyear; constintmonth; constintday;public: Date(inty,intm,intd); voidshowdate();};Date::Date(inty,intm,intd){ year=y; month=m; day=d;}voidDate::showdate(){ cout<<year<<"/"<<month<<"/"<<day<<endl;}voidmain(){ constDateobj(,10,30); obj.showdate();}问题一:以上程序有两个错误,试指出来,并更正之?答:第一处错误是:结构函数应当用组员初始化列表对常数据组员初始化;第二处错误是:没有用常组员函数访问常对象数据组员。更正后的程序为:#include<iostream>usingnamespacestd;classDate{private: constintyear; constintmonth; constintday;public: Date(inty,intm,intd); voidshowdate()const;};Date::Date(inty,intm,intd):year(y),month(m),day(d){}voidDate::showdate()const{ cout<<year<<"/"<<month<<"/"<<day<<endl;}voidmain(){Dateobj(,10,30); obj.showdate();}试验五派生与继承—单基派生5.1试验目标1.了解继承的概念;2.了解共有派生、私有派生和保护派生;3.了解单基派生类中结构函数和析构函数的执行次序。5.2试验内容5.2.1程序阅读1.了解下面的程序并运行,然后回答背面的问题。#include<iostream.h>classCBase{public: CBase(inta) :a(a) { }protected: voidprint() { cout<<"a="<<a<<endl; }private: inta;};classCDerive:publicCBase{public: voidprint() { CBase::print(); cout<<"b="<<b<<endl; }private: intb;}voidmain(){ CDerived; d.print(); CBaseb; b.print();}问题一:以上程序有两个错误,试指出来,并更正之。答:类CBase中的组员数据应当为公有访问属性,第二个错误是结构函数有问题。更正后的程序有两种:①#include<iostream>usingnamespacestd;classCBase{public: CBase(inta):a(a) { }Voidprint() { cout<<"a="<<a<<endl; }public: inta;};classCDerive:publicCBase{public: CDerive(inta,intb):CBase(a),b(b) { } voidprint() { CBase::print(); cout<<"b="<<b<<endl;}private: intb;};voidmain(){ CDerived(6,4); d.print(); CBaseb(5); b.print();}②#include<iostream>usingnamespacestd;classCBase{public: voidprint() { cout<<"a="<<a<<endl; }public: inta;};classCDerive:publicCBase{public: voidprint() { CBase::print(); cout<<"b="<<b<<endl; }private: intb;};voidmain(){ CDerived; d.print(); CBaseb; b.print();}2.了解下面的程序并运行,然后回答背面的问题。#include"iostream.h"classCBase{public: CBase(inta) :a(a) { cout<<"basestructure"<<endl; } ~CBase() { cout<<"basedestructure"<<endl; } voidprint() { cout<<"a="<<a<<endl; }protected: inta;};classCDerive:publicCBase{public: CDerive(inta,intb,intc) :CBase(a),b(b),c(c) { cout<<"dervicestructure"<<endl; } ~CDerive() { cout<<"derivedestructure"<<endl; } voidprint() { CBase::print(); cout<<"b.a="<<b.a<<endl; cout<<"c="<<c<<endl; }private: CBaseb; intc;};voidmain(){ CDerived(1,2,3); d.print();}问题一:以上程序的输出成果是什么,为何?答:输出成果是原因是基类和派生类中结构函数和析构函数的执行次序。问题二:①处语句执行完后,d.b.a的值为多少?答:值为1。试验六派生与继承—多基派生6.1试验目标1.了解多基派生的定义;2.基派生中的结构函数与析构函数的调用次序;3.了解多基派生中虚基类的作用。6.2试验内容6.2.1程序阅读1.了解下面的程序并运行,然后回答背面的问题。classCBase1{public: CBase1(inta) :a(a) { cout<<"base1structure..."<<endl; } ~CBase1() { cout<<"base1destructure..."<<endl; } voidprint() { cout<<"a="<<a<<endl; }protected: inta;};classCBase2{public: CBase2(intb) :b(b) { cout<<"base2structure..."<<endl; } ~CBase2() { cout<<"base2destructure..."<<endl; } voidprint() { cout<<"b="<<b<<endl; }protected: intb;};classCDerive:publicCBase1,publicCBase2{public: CDerive() { cout<<"derivestructure..."<<endl; } ~CDerive() { cout<<"derivedestructure..."<<endl; } voidprint() { CBase1::print(); CBase2::print(); b1.print(); b2.print(); cout<<"c="<<c<<endl; }private: CBase1b1; CBase2b2; intc;};voidmain(){ CDerived; d.print();}问题一:更正以上程序中的错误,并分析输出成果。答:CBase1与CBase2没有适宜的结构函数,更正措施在CBase1,CBase2设置缺省值为0更正:将CDerive结构函数改为:CDerive(inta,intb,intc): CBase1(a),CBase2(b),b1(a),b2(b),c(c) { cout<<"derivestructure..."<<endl; }主函数中CDerived;改为CDerived(1,2,3);输出成果是:试验七多态性—函数与运算符的重载7.1试验目标了解静态联编和动态联编的概念;掌握组员函数方式运算符重载;掌握友元函数方式运算符重载;掌握++、--、=运算符的重载。7.2试验内容1.了解下面的程序并运行,然后回答背面的问题。#include"iostream.h"classCComplex{public: 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; cout<<obj.real<<endl; cout<<obj.imag<<endl;}问题一:①处的运算符重载,为何该函数的返回值要设计成Ccomplex类型?答:①处运算符重载,要返回两个值real和imag,因此函数返回值类型设计为CComplex类型。问题二:②处的运算符重载函数调用就相称于“obj=operator+(obj1,obj2);”,请问CComplex类中的运算符重载函数为何只有一个参数?答:因为调用重载运算符的对象自身相称于一个参数。课后习题第二章一试验目标1.掌握引用的使用。2.掌握调用函数的措施。二.试验内容2.19写出下列程序的运行成果。#include<iostream>usingnamespacestd;voidf(int&m,intn){inttemp;temp=m;m=n;n=temp;}Intmain(){inta=5,b=10;f(a,b)cout<<a<<””<<b<<endl;return0;}三.试验成果四.心得体会1.引用能够作为函数形参,和指针变量作为函数参数效果同样,不过引用作为函数参数更清楚。2.第三章一.试验目标1.掌握静态数据组员的使用。2.掌握静态组员函数的使用。二.试验内容3.26写出下列程序的运行成果。#include<iostream>usingnamespacestd;ClassM{intA;staticintB;public:M(inta){A=a;B+=a;cout<<”Constructing\n”<<endl;}Staticvoidf1(Mm);~M(){cout<<”Destructing\n”<<endl;}};VoidM::f1(Mm){Cout<<”A=”<<m.A<<endl;Cout<<”B=”<<b<<endl;}intM::B=0;intmain(){MP(5),Q(10);M::f1(P);M::f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论