第1页共12页上海大学2015~2016学年度秋季学期试卷(A卷)课程名:面向对象程序设计课程号:08305121学分:5应试人声明:我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。应试人应试人学号应试人所在院系题号一(20)二(20)三(20)四(40)得分——————————————————————————————————————一、判断题(每小题2分,共20分)1.类的构造函数的函数名与类名相同,可以重载构造函数。(√)2.类的析构函数可以被重载。(×)3.重载运算符函数不能改变运算符的操作数个数、优先级和结合方向。(√)4.引用在声明时必须对其初始化,以绑定某个已经存在的变量(或对象),在该引用的生命期内,该绑定不能被更改。(√)5.指针变量在定义时必须对其初始化,以锁定某个已经存在的目标变量(或对象),在该指针变量的生命期内,该指向不能被更改。(×)6.类的非静态成员函数均有一个隐含的形式参数this指针常量,用于指向调用该函数的对象。函数体中不能改变该指针常量的指向(即锁定调用该函数的对象)。(√)7.派生类继承了基类的所有数据成员,并且在派生类的成员函数中都能直接访问基类的访问属性为private的成员。(×)8.构造派生类对象时,先调用基类的构造函数,后执行派生类的构造函数。析构派生类对象时,先调用基类的析构函数,后执行派生类的析构函数。(×)9.含纯虚函数的类称为抽象类,不能创建抽象类的对象,不能定义抽象类的指针变量,不能声明抽象类的引用。(×)10.引用返回的函数可以作左值,也避免了函数值返回时创建与返回类型相同的临时无名对象。(√)成绩得分第2页共12页二、填空题(每空2分,共20分)如下设计了一个字符串类String,请根据运行结果,完成程序。#includeiostream#includecstring#includestringusingnamespace①std;classString{public:String(constchar*str=){size=strlen(②str);x=size0?newchar[size]:NULL;if(x==NULL)size=0;for(inti=0;isize;i++)x[i]=str[i];}String(constString&s):x(③NULL){*this=s;//直接利用深赋值运算符函数}virtual~String(){if(x!=NULL)delete④[]x;size=0;}String&operator=(constString&s){if(this==⑤&s)return*this;if(x!=NULL)delete[]x;size=s.size;x=newchar[size];if(x==NULL)size=0;for(inti=0;isize;i++)x[i]=s.x[i];return⑥*this;}⑦char&operator[](intindex){returnx[index];}friendostream&operator(ostream&out,constString&s){得分第3页共12页for(inti=0;is.size;i++)outs.x[i];return⑧out;}⑨friendistream&operator(istream&in,String&s){stringstr;instr;//利用C++字符串s=String(str.c_str());//利用深赋值运算符returnin;}friend⑩intCompare(constString&s1,constString&s2){inti;for(i=0;is1.size&&is2.size&&s1.x[i]==s2.x[i];i++);if(is1.size&&is2.size)returns1.x[i]s2.x[i]?1:-1;elseif(is1.size&&i==s2.size)return1;elseif(i==s1.size&&is2.size)return-1;elsereturn0;}friendbooloperator(constString&s1,constString&s2){returnCompare(s1,s2)0;}friendbooloperator=(constString&s1,constString&s2){returnCompare(s1,s2)=0;}friendbooloperator(constString&s1,constString&s2){returnCompare(s1,s2)0;}friendbooloperator=(constString&s1,constString&s2){returnCompare(s1,s2)=0;}friendbooloperator==(constString&s1,constString&s2){returnCompare(s1,s2)==0;}friendbooloperator!=(constString&s1,constString&s2){returnCompare(s1,s2)!=0;}protected:char*x;intsize;};第4页共12页voiddisplay(constString&s1,constString&s2){char*str[]={小于,等于,大于};cout\s1\str[1+Compare(s1,s2)]\s2\\tendl;}intmain(){Strings1(Helloworld!),s2(s1);display(s1,s2);s2[0]='h';display(s1,s2);s2=Helloworld;display(s1,s2);s2=Helloworld;display(s1,s2);s1=;s2=;display(s1,s2);return0;}三、阅读程序写出运行结果(每行1分,共20分)3.1(10分)本题所涉及的Time类,相关头文件和源程序文件如下。//MyTime.h头文件#ifndefMYTIME_H#defineMYTIME_H#includeiostream#includeiomanipusingnamespacestd;classTime{public:Time(inthour=0,intminute=0,intsecond=0);Time&operator++();Timeoperator++(int);friendTimeoperator+(constTime&t,intn);friendostream&operator(ostream&out,constTime&t);friendistream&operator(istream&in,Time&t);protected:inth,m,s;};#endif运行结果Helloworld!等于Helloworld!Helloworld!小于helloworld!Helloworld!大于HelloworldHelloworld!大于Helloworld等于得分第5页共12页//MyTime.cpp源程序文件#includeMyTime.hTime::Time(inthour,intminute,intsecond):h(hour),m(minute),s(second)//构造函数{}Time&Time::operator++(){s++;if(s==60){s=0;m++;}if(m==60){m=0;h++;}if(h==24)h=0;return*this;}TimeTime::operator++(int){Timetemp(*this);++(*this);returntemp;}Timeoperator+(constTime&t,intn){Timeresult(t);intx=(t.h*60+t.m)*60+t.s+n;while(x0)x+=24*60*60;x%=24*60*60;result.s=x%60;result.m=x/60%60;result.h=x/3600;returnresult;}ostream&operator(ostream&out,constTime&t){outsetfill('0')setw(2)t.h':'setw(2)t.m':'setw(2)t.ssetfill('');returnout;}istream&operator(istream&in,Time&t){charstr[200];in.getline(str,200,':');t.h=atoi(str);in.getline(str,200,':');t.m=atoi(str);第6页共12页in.getline(str,200);t.s=atoi(str);returnin;}//main.cpp源程序文件(测试程序)intmain(){Timet0(23,59,50),t;t=t0;cout++tendl;t=t0;++t;couttendl;t=t0;++++t;couttendl;t=t0;coutt++endl;t=t0;t++;couttendl;t=t0;t++++;couttendl;t=t0;t=t+(-3600);couttendl;cout请输入时间(hh:mm:ss):;cint;couttendl;cout++tendl;coutt+(10*60+20)*60+30endl;return0;}3.2(10分)以下4小题所涉及的Test1类,相关头文件和源程序文件如下。//test03.h头文件#ifndefTEST03_H#defineTEST03_H#includeiostreamusingnamespacestd;classTest1{public:Test1(inta=0);Test1(constTest1&t);virtual~Test1();Test1&operator=(constTest1&t);staticintNum();staticintSum();friendostream&operator(ostream&out,constTest1&t);friendistream&operator(istream&in,Test1&t);protected:staticintnum,sum;运行结果(3.1)23:59:5123:59:5123:59:5223:59:5023:59:5123:59:5122:59:50请输入时间:23:59:5923:59:5900:00:0010:20:30第7页共12页intx;};voidShow();//普通的C++函数声明#endif//Test03.cpp源程序文件#includeTest03.hintTest1::num=0,Test1::sum=0;//静态数据成员定义及初始化Test1::Test1(inta):x(a)//构造函数{num++;sum+=x;}Test1::Test1(constTest1&t):x(t.x)//拷贝构造函数{num++;sum+=x;}Test1::~Test1(){num--;sum-=x;}Test1&Test1::operator=(constTest1&t)//赋值运算符函数{sum+=t.x-x;x=t.x;return*this;}intTest1::Num(){returnnum;}intTest1::Sum(){r