1、 上海大学15-16级C++试题 精品文档 成 绩 上海大学2015~2016学年度秋季学期试卷(A卷) 课程名: 面向对象程序设计 课程号: 08305121 学分: 5 应试人声明: 我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。 应试人 应试人学号 应试人所在院系 题号 一(20) 二(20) 三(20) 四(40) 得分 得 分 ———————
2、——————————————————————————————— 一、判断题(每小题2分,共20分) 1. 类的构造函数的函数名与类名相同,可以重载构造函数。 (√) 2. 类的析构函数可以被重载。 (×) 3. 重载运算符函数不能改变运算符的操作数个数、优先级和结合方向。 (√) 4. 引用在声明时必须对其初始化,以绑定某个已经存在的变量(或对象), 在该引用的生命期内,该绑定不能被更改。 (√) 5. 指针变量在定义时必须对其初始化,以锁定某个已经存在的目标变量(或 对象),在该指针变量的生命期内,该指向不能被更改。 (×) 6. 类的非静态成员函数均有一个隐含的形式参数th
3、is指针常量,用于指向 调用该函数的对象。函数体中不能改变该指针常量的指向(即锁定调用该 函数的对象)。 (√) 7. 派生类继承了基类的所有数据成员,并且在派生类的成员函数中都能直接 访问基类的访问属性为private的成员。 (×) 8. 构造派生类对象时,先调用基类的构造函数,后执行派生类的构造函数。 析构派生类对象时,先调用基类的析构函数,后执行派生类的析构函数。 (×) 9. 含纯虚函数的类称为抽象类,不能创建抽象类的对象,不能定义抽象类的 指针变量,不能声明抽象类的引用。 (×) 10. 引用返回的函数可以作左值,也避免了函数值返回时创建与返回类型相同 的临时无名对象。
4、√)
得
分
二、填空题(每空2分,共20分)如下设计了一个字符串类String,请根据运行结果,完成程序。
#include
5、0;
for(int i=0; i 6、f(x!=NULL) delete [] x;
size = s.size;
x = new char[size];
if(x==NULL) size = 0;
for(int i=0; i 7、i=0; i 8、 {
int i;
for(i=0; i 9、const String &s1, const String &s2)
{ return Compare(s1, s2) < 0; }
friend bool operator<=(const String &s1, const String &s2)
{ return Compare(s1, s2) <= 0;}
friend bool operator>(const String &s1, const String &s2)
{ return Compare(s1, s2) > 0; }
friend bool operator>=(const String &s1 10、 const String &s2)
{ return Compare(s1, s2) >= 0;}
friend bool operator==(const String &s1, const String &s2)
{ return Compare(s1, s2) == 0;}
friend bool operator!=(const String &s1, const String &s2)
{ return Compare(s1, s2) != 0;}
protected:
char *x;
int size;
};
void display(con 11、st String &s1, const String &s2)
{
char *str[] = {"小于", "等于", "大于"};
cout << "\"" << s1 << "\" " << str[1+Compare(s1, s2)]
<< " \"" << s2 << "\"\t" << endl;
}
int main()
{ String s1("Hello world!"), s2(s1);
运行结果
"Hello world!" 等于 "Hello world!"
"Hello world!" 小于 "hello world!"
"Hel 12、lo world!" 大于 "Hello world "
"Hello world!" 大于 "Hello world"
"" 等于 ""
display(s1, s2);
s2[0] = 'h';
display(s1, s2);
s2 = "Hello world ";
display(s1, s2);
s2 = "Hello world";
display(s1, s2);
s1 = ""; s2 = "";
display(s1, s2);
return 0;
}
得
分
三、阅读程序写出运行结果(每行1分,共20分)
3.1(1 13、0分)本题所涉及的Time类,相关头文件和源程序文件如下。
// MyTime.h 头文件
#ifndef MYTIME_H
#define MYTIME_H
#include 14、r+(const Time &t, int n);
friend ostream & operator<<(ostream &out, const Time &t);
friend istream & operator>>(istream &in, Time &t);
protected:
int h, m, s;
};
#endif
// MyTime.cpp 源程序文件
#include "MyTime.h"
Time::Time(int hour, int minute, int second)
: h(hour), m( 15、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;
}
Time Time::operator++(int)
{
Time temp(*this);
++(*this);
return temp;
}
Time operator+(const Time &t, int n)
{
Time result( 16、t);
int x = (t.h*60 + t.m)*60 + t.s + n;
while(x<0)
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)
{
out << setfill('0') << setw(2) << t.h << ':'
<< setw(2)< 17、 ':' << setw(2)< 18、
23:59:51
23:59:52
23:59:50
23:59:51
23:59:51
22:59:50
请输入时间:23:59:59
23:59:59
00:00:00
10:20:30
// main.cpp 源程序文件(测试程序)
int main()
{
Time t0(23,59,50), t;
t=t0; cout << ++t << 19、 endl;
t=t0; ++t; cout << t << endl;
t=t0; ++++t; cout << t << endl;
t=t0; cout << t++ << endl;
t=t0; t++; cout << t << endl;
t=t0; t++++; cout << t << endl;
t=t0; t=t+(-3600); cout << t << endl;
cout << "请输入时间(hh:mm:ss) : ";
cin >> t;
cout << t << endl;
cout << ++t << endl;
20、 cout << t + (10*60+20)*60+30 << endl;
return 0;
}
3.2(10分)以下4小题所涉及的Test1类,相关头文件和源程序文件如下。
// test03.h 头文件
#ifndef TEST03_H
#define TEST03_H
#include 21、 operator=(const Test1 &t);
static int Num();
static int Sum();
friend ostream & operator<<(ostream &out, const Test1 &t);
friend istream & operator>>(istream &in, Test1 &t);
protected:
static int num, sum;
int x;
};
void Show(); // 普通的C++函数声明
#endif
// Test03.cpp 22、 源程序文件
#include "Test03.h"
int Test1::num=0, Test1::sum=0; //静态数据成员定义及初始化
Test1::Test1(int a):x(a) // 构造函数
{
num++; sum+=x;
}
Test1::Test1(const Test1 &t):x(t.x) // 拷贝构造函数
{
num++; sum+=x;
}
Test1::~Test1()
{
num--; sum-=x;
}
Test1 & Test1::operator=(const Test1 &t) / 23、/ 赋值运算符函数
{
sum += t.x - x;
x = t.x;
return *this;
}
int Test1::Num() {return num;}
int Test1::Sum() {return sum;}
ostream & operator<<(ostream &out, const Test1 &t)
{
out << t.x;
return out;
}
istream & operator>>(istream &in, Test1 &t)
{
int temp;
in >> temp;
Test1::sum += 24、 temp - t.x;
t.x = temp;
return in;
}
void Show() // 普通的C++函数
{
cout << "Num = " << Test1::Num()
<< ",\tSum = " << Test1::Sum() << endl;
}
// 3.2.1 测试程序之一
#include "Test03.h"
运行结果(3.2.1)
Num = 0 , Sum = 0
int main()
{
Show();
return 0;
}
// 3.2.2 测 25、试程序之二
#include "Test03.h"
Test1 x(100); // 创建一个全局对象
void f(Test1 t)
{
Show();
}
运行结果(3.2.2)
Num = 1 , Sum = 100
Num = 2 , Sum = 200
Num = 1 , Sum = 100
int main()
{
Show();
f(x);
Show();
return 0;
}
// 3.2.3 测试程序之三
#include "Test03.h"
void 26、 f(Test1 &t)
{
Show();
}
int main()
运行结果(3.2.3)
Num = 1 , Sum = 100
Num = 1 , Sum = 100
Num = 1 , Sum = 100
{
Test1 x(100); // 创建一个自动对象
Show();
f(x);
Show();
return 0;
}
// 3.2.4 测试程序之四
#include "Test03.h"
int main()
运行结果(3.2.4)
Num = 4 , 27、 Sum = 60
Num = 5 , Sum = 90
Num = 4 , Sum = 60
{
Test1 x(10),y(20),a[2]={x,y}
Show();
Test1 *p = new Test1;
*p = 30;
Show();
delete p;
Show();
return 0;
}
得
分
四、(40分)设计复数类。要求运行时得到指定的输出结果。
① 实现如下测试程序中用到的9个函数(每个函数3分。无须定义拷贝构造函数、析构函数及赋值运算符函数);
② 28、自选3个运算符,并实现运算符函数重载(每个函数3分。注意复数不能比较大小);
③ 数据成员、类设计的其他部分(4分)。
【注意:数学函数double atan2(double y, double x);当x≠0时返回y/x的反正切值,当x=0时返回π/2或-π/2(正负号与y同号)】。
#include "Complex.h"
int main()
{
Complex x(3,4), y(x), z; // 创建对象
cout << x << ", " << y << ", " << z << endl; // 输出复数
cout << x.Abs() 29、<< '\t'; // 计算复数的模长
z.Real() = z.Imag() = 1; // 设置复数的实部、虚部
cout << z.Angle()*180/M_PI << endl; // 计算复数的角度
cout << x+z << '\t'; // 复数的算术运算: +、*,迭代赋值 *=
运行结果(4.1)
(3, 4), (3, 4), (0, 0)
5 45
(4, 5) (-1, 7) (-7, 24)
cout << x*z << '\t';
cout << (x*=x) << endl;
return 0;
}
30、
// Complex.h
#include 31、nst { 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;
return result;
}
friend Complex operator*(const Complex &c1, const Complex &c2)
{
Complex result;
result.re 32、 = c1.re*c2.re - c1.im*c2.im;
result.im = c1.re*c2.im + c1.im*c2.re;
return result;
}
Complex & operator*=(const 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;
};
收集于网络,如有侵权请联系管理员删除






