期中测验题目及参考答案 类-对象-运算符重载

  学期过半,通过期中测验,让同学们检验一下阶段学习的效果。

  共半小时的题,强度与期末考试差不多,总体感觉还不错。平时学扎实了,复习一下,将各种语法、机制搞清楚,拿个好分数不在话下。也有些同学不熟练,需要开始在意了,考试是一方面,重要的是,真正掌握知识。

  期中测验可以看书及一切参考资料,实际上关键还是自己脑子里的东西。程序设计的基本功是在脑子里的。因为在机房完成,有同学用上了百度。老贺没有责备,反而大加赞赏:这才是老贺的弟子,规则没有禁止用百度,就要找适合自己的办法。

  程序要好好调下去,考试也要来个好分数。

  下面给出参考答案。当然,仅供参考。

  全卷共20分。

1. 分析以下程序的执行结果

 

#include<iostream>
using namespace std;
class Sample
{
private:
         int i;
         double d;
public:
         void setdata(int n){i=n;}
         void setdata(double x){d=x;}
         void disp()
         {
                   cout<<"i="<<i<<",d="<<d<<endl;
         }
};
void main()
{        Sample s;
         s.setdata(10);
         s.setdata(15.6);
         s.disp();
}

(1分)输出结果为: i=10, d=15.6

(2分)简要说明理由:main()函数中执行s.setdata(10)时,执行的是形式参数为int型的成员函数,而s.setdata(15.6)时,执行形式参数为double的成员函数,分别为数据成员 i 和 d 赋 值。本题主要考察了成员函数的重载。

 

2. 分析以下程序的执行结果

 

#include<iostream>
using namespace std;
class Sample
{
 private:
         int x;
public:
         Sample(){};
         Sample(int a){x=a;}
         Sample(Sample &a){x=a.x+1;}
         voiddisp(){cout<<"x="<<x<<endl;}
};
void main()
{
       Sample s1(2),s2(s1);
       s2.disp();
}

(1分)输出结果为: x=3

(2分)简要说明理由:对main()函数,s1对象中的x成员的值为2,对s2初始化时,利用复制构造函数,s2的 x 成员的值为参数中对象的 x 值加1。本题考察对复制构造函数的理解。

 

3. 阅读程序,回答问题

 

#include <iostream >
using namespace std;
class Point
{
private:
         int x,y;
public:
         void Display(){cout<<"x="<<x<<",y="<<y<<endl;}
};
void main()
{
         Point point1;
         point1.x=100;
         point1.y=200;
         point1.Display();
}

 

(1分)指出该程序中存在的错误:在main()函数中访问对象的私有成员:对 x 和 y 赋值。

(2分)请至少说明修改程序的两种方案(下面给出四种):
(1) 将x和y的访问权限设置为public(这并不是一种好的设计)
(2) 增加两个public型的成员函数void setX(int a){x=a;}和void setY(int b){y=b;}(推荐用)
(3) 在类中定义构造函数Point(int a, int b):x(a),y(b){},然后在main()中用Point point1(100,200);
(4) 在display()中加x=100; y=200,而将main()函数中的相应赋值去掉。(不能算错,但很馊的主意)

4. 程序填空

 

class Point
{private:
   int x, y;
 public:
   Point(){x=y=0;}
   Point(int x0,int y0){x=x0;y=y0;}
   int GetX() { return x; }
   int GetY() { return y; }
   void Print();
   ___(1)___;  //友元函数声明
   ___(2)___;  //友元函数声明
};
//实现Print()成员函数
________(3)______________
{  cout<<"Point("<<x<<","<<y<<")";
}
//加号操作符重载函数
//实现Point类对象与整数加法
Point operator+(Point& pt,int dd)
{  Point temp=pt;
  temp.x+=dd;
  temp.y+=dd;
  return temp;
}
//加号操作符重载函数
//实现两个Point类对象的加法
Point operator+(Point& pt1,Point& pt2)
{
  Point temp=pt1;
  temp.x+=pt2.x;
  ___(4)___;
  return temp;
}

解答(4分):

 

(1) friend Point operator+(Point& pt,int dd)

 

(2) friend Point operator+(Point& pt1,Point& pt2)

(3) void Point::Print()

(4) temp.y+=pt2.y


5.定义一个处理日期的类CDate,它有3个私有数据成员:Year,Month,Day和若干个公有成员函数,并实现如下要求:

(1)构造函数重载;

(2)成员函数设置缺省参数;

(3)定义一个成员函数PrintDate来打印日期;

(4)定义一个非静态成员函数SetDate来设置日期;

(5)重载<<运算符,用于输出日期。

参考解答:(7分:类定义正确3分,各函数实现正确4分,有1个要求体现不出来扣1分)

 

#include <iostream>
using namespace std;
class CDate
{
public:
	CDate(){year=0;month=1;day=1;} 
	CDate(int y, int m, int d):year(y),month(m), day(d){}//(1)与前一个函数,体现构造函数重载
	void PrintDate()   //(3)定义一个成员函数PrintDate来打印日期;
	{
		cout<<"year="<<year<<", month="<<month<<", day="<<day<<endl;
	}
	void setDate(int y=0, int m=1, int d=1) //(4)定义一个非静态成员函数SetDate来设置日期;还体现(2)成员函数设置缺省参数;
	{
		year=y;
		month=m;
		day=d;
	}
	friend ostream &operator<<(ostream &out, const CDate &d);//连同类外的实现,体现(5)重载<<运算符,用于输出日期。
private:
	int year;
	int month;
	int day; 
}

ostream &operator<<(ostream &out, const CDate &d)
{
	cout<<"year="<<d.year<<", month="<<d.month<<", day="<<d.day<<endl;
}

说明:

 

(1)main() 函数可以不写,题目中没有提到;

(2)“成员函数设置缺省参数”的要求还可以体现到别的函数中;

(3)默认构造函数区别于成员函数的默认(缺省)参数;

(4)CDate(int y=0, int m=1, int d=1)与CDate()不能共存,不要在这儿体现缺省参数。

(5)CDate(){year=0;month=1;day=1;} 不体现缺省参数,缺省参数必须是在函数声明时,在形式参数上做出的定义。

 

测验成绩统计(均分15):

成绩/人数

1-5/ 4

6-9/ 7

10/3

12/4

13/4 

14/6 

15/6

16/10

17 /12

18/10 

19 /13

20/5

(12分及以下的,将在16周再次进行一次最高分为16分的测验,取其高者记入平时成绩;其他15分及以下的同学自愿参加。)

 

上一篇:日期操作工具类


下一篇:435. Non-overlapping Intervals - Medium