1、上海大学1516级C+试题成上海大学20152016学年度秋季学期试卷(A卷)绩 课程名:面向对象程序设计 课程号:08305121学分:5 应试人声明:我保证遵守上海大学学生手册中的上海大学考场规则 ,如有考试违纪、作弊行为,愿意接受上海大学学生考试违纪、作弊行为界定及处分规定的纪律处分。 应试人 应试人学号 应试人所在院系 题号一 (20)二(20)三(20)四(40)得分得 一、判断题(每小题2分,共20 分)1.类的构造函数的函数名与类名相同,可以重载构造函数。 (V)2.类的析构函数可以被重载。 (X)3.重载运算符函数不能改变运算符的操作数个数、优先级和结合方向。 (V)4.引用在
2、声明时必须对其初始化,以绑定某个已经存在的变量(或对象) ,在该引用的生命期内,该绑定不能被更改。 (V)5.指针变量在定义时必须对其初始化,以锁定某个已经存在的目标变量(或对象),在该指针变量的生命期内,该指向不能被更改。 (X)6.类的非静态成员函数均有一个隐含的形式参数 this 指针常量,用于指向调用该函数的对象。函数体中不能改变该指针常量的指向(即锁定调用该函数的对象)。 (V)7.派生类继承了基类的所有数据成员,并且在派生类的成员函数中都能直接访问基类的访问属性为private 的成员。 (X)8.构造派生类对象时,先调用基类的构造函数,后执行派生类的构造函数。析构派生类对象时,先
3、调用基类的析构函数,后执行派生类的析构函数。 (X)9.含纯虚函数的类称为抽象类,不能创建抽象类的对象,不能定义抽象类的指针变量,不能声明抽象类的引用。 (X)10.引用返回的函数可以作左值,也避免了函数值返回时创建与返回类型相同的临时无名对象。 (V)得分二、填空题(每空2分,共20分)如下设计了一个字符串类String ,请 根据运行结果,完成程序。#in elude #in elude #in elude using n amespaee std ;class Stringpublic :String( const char *str=) size = strle n( str );x
4、= size0 ? new char size : NULL;if (x=NULL) size = 0;for (int i=0; isize; i+)xi = stri;Stri ng( con st Stri ng &s) : x( NULL )* this = s; /直接利用深赋值运算符函数virtual Stri ng()if (x!=NULL) delete x;size = 0;String &operator =( const String &s)if (this = &s ) return * this if (x!=NULL) delete x;size = s.size;
5、x = new char size;if (x=NULL) size = 0;for (int i=0; isize; i+)xi = s.xi;return *this ; char &operator ( int index) return xindex; friend ostream &operator (ostream &out, const Stri ng &s)for (int i=0; is.size; i+)out (istream &n, Stri ng &s)string str;in str; /利用C+字符串s = Stri ng(str.c_str(); /利用深赋值
6、运算符return in;friend int Compare( const String &s1, const String &s2) int i;for (i=0; is1.size & is2.size & s1.xi=s2.xi; i+)if (is1.size & i s2.xi ? 1 : -1;else if (is1.size & i=s2.size)return 1;else if (i=s1.size & is2.size)return -1;elsereturn 0;char *str = 小于, 等于,大于;cout si str1+Compare(s1, s2) s2
7、 t endl;3.1 (10分)本题所涉及的Time类,相关头文件和源程序文件如下头文件/ MyTime.h#ifndef MYTIME_H #defi ne MYTIME_H #in clude #in clude using namespace std;class Timepublic :Time( int hour=0, int minu te=0, int sec on d=0);Time &operator +();Time operator +( int );friend Time operator +( const Time &t, int n);frie nd ostream
8、 & operator (istream &n. Time &t);protected :int h, m, s;#en dif源程序文件/ MyTime.cpp#in clude MyTime.hTime:Time(i nt hour, i nt minu te, int sec ond)/构造函数:h(hour), m(minu te), s(sec ond)Time &Time: operator +()s+;if (s=60) s = 0; m+; if (m=60) m = 0; h+; if (h=24) h = 0; return * this ;Time Time: opera
9、tor +( int )Time temp(* this );+(* this );return temp;Time operator +(const Time &t, int n)Time result(t);int x = (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;return result;ostream &operator (ostream &out, const Time &t)ou
10、t setfill(0) setw(2) t.h : setw(2)t.m : setw(2)t.s (istream &n, Time &t)char str200;in .getli ne(str, 200, :);t.h = atoi(str);in .getli ne(str, 200, :);t.m = atoi(str);in.getline(str, 200);t.s = atoi(str);return in;运行结果(3.1)23:59:5123:59:5123:59:5223:59:5023:59:5123:59:5122:59:50请输入时间:23:59:5923:59:
11、5900:00:0010:20:30/ mai n.cpp 源程序文件(测试程序)int mai n()Time t0(23,59,50), t;t=tO; cout +t en dl;t=tO; +t; cout t en dl;t=t0; +t; cout t en dl;t=t0; cout t+ en dl;t=t0; t+; cout t en dl;t=t0; t+; cout t en dl;t=t0; t=t+(-3600); cout t endl;cout t;cout t en dl;cout +t en dl;cout t + (10*60+20)*60+30 endl
12、; return 0;3.2 (10分)以下4小题所涉及的Test1类,相关头文件和源程序文件如下。/ test03.h 头文件#ifndef TEST03_H#defi ne TEST03_H#in clude using namespace std;class Test1public :Test1( int a=0);Test1( con st Test1 &t);virtual Test1();Test1 & operator =( const Test1 &t);static int Num();static int Sum();frie nd ostream &operator (i
13、stream &in, Test1 &t);protected :static int num, sum;int x;void Show(); /普通的C+函数声明#en dif源程序文件/ Test03.cpp#in elude Test03.hTest1:sum += temp - t.x; t.x = temp;return in;void Show()/普通的C+函数cout Num = Test1:Num(),tSum = Test1:Sum() endl; / 321测试程序之一#in elude Test03.h运行结果(3.2.1)Num = 0 , Sum = 0int ma
14、i n() Show(); return 0;/ 3.2.2测试程序之二#in elude Test03.hTest1 x(100); /创建一个全局对象void f(Test1 t)Show();运行结果(3.2.2)Num =1 ,Sum =100Num =2 ,Sum =200Num =1 ,Sum =100int mai n()Show(); f(x);Show(); return 0;/ 3.2.3测试程序之三#in elude Test03.hvoid f(Test1 &t) Show();int mai n()Testi x(100); / 创建一个自动对象Show();f(x)
15、;Show();return 0;/ 3.2.4测试程序之四#in elude Test03.hint mai n()运行结果(323)Num = i , Sum = 100Num = i , Sum = 100Num = 1 , Sum = 100Testi x(10),y(20),a2=x,y Show();Testi *p = new Testi;*p = 30;运行结果(3.2.4)Num = 4 , Sum = 60Num = 5 , Sum = 90Num = 4 , Sum = 60Show(); delete p; Show(); return 0;得 分四、(40分)设计复数
16、类。要求运行时得到指定的输出结果1实现如下测试程序中用到的9个函数(每个函数3分。无须定义拷贝构造函数、析构函数及赋值运算符函数);2自选3个运算符,并实现运算符函数重载(每个函数3分。注意复数不能比较大小);3数据成员、类设计的其他部分(4分)。【注意:数学函数double atan2( double y, double x);当xO时返回y/x的反正切值,当x=0时返回n2或-n2 (正负号与y同号)】#in elude Complex.h#in elude using n amespaee std;elass Complex publie:Complex(double real=O, d
17、ouble imag=O):re(real),im(imag)double &Real() return re; double &lmag() return im; double An gle() const retur n ata n2(im, re); double Abs() const return sqrt(re*re + im*im); friend Complex operator+(const Complex &c1, const Complex &c2)Complex result(c1);result.re += c2.re;result.im += c2.im;retur
18、n result;friend Complex operator*(const Complex &c1, const Complex &c2)Complex result;result.re = c1.re*c2.re - c1.im*c2.im;result.im = c1.re*c2.im + c1.im*c2.re;return result;Complex &operator*=(c onst Complex &c)double x = re*c.re - im*c.im;im = re*c.im + im*c.re;re = x;return *this;friend ostream &operator(ostream &out, const Complex &c)out ( c.re , c.im );return out;protected: double re, im;;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1