C笔试试卷A卷答案解
析
集团文件版本号:(M928-T898-M248-WU2669-I2896-
考试中心填写:
湖南大学课程考试试卷
课程名称:高等程序设计;课程编码:试卷编号:;考
A. 不能带有参数
B. 最多只能带有2个参数
C. 只能带有一个参数
D. 可以带多个参数
析:记住,类型转换函数有三个特点:1必须是成员函数2无返回类型3无参数
4.静态成员函数没有( B )。
A. 返回值
B. this指针
C. 指针参数
D. 返回类型
析:故静态成员函数不能访问类的一般成员(静态成员除外)5.定义类模板时要使用关键字( D )。
A. const
B. new
C. delete
D. template
6.下列不具有访问权限属性的是( A )。
A. 非类成员
B. 类成员
C. 数据成员
D. 函数成员
析:答案显然,但非类成员可能能访问类成员,如友元函数7.C++语言鼓励程序员在程序设计时将( C )。
A. 数据和操作分别封装
B. 不同类型的数据封装在一起
C. 数据和操作封装在一起
D. 不同作用的操作封装在一起
8.所谓多态性是指( B )。
A. 不同的对象调用不同名称的函数
B. 不同的对象调用
相同名称的函数
C. 一个对象调用不同名称的函数
D. 一个对象调用不
同名称的对象
9.解决二义性问题的方法有( C )。
A. 只能使用作用域分辨操作符
B. 使用作用域分辨操作符或赋值兼容规则
C. 使用作用域分辨操作符或虚基类
D. 使用虚基类或赋值兼容规则
10.如果在类CTest的外面函数调用CTest::f();则函数f()是类CTest的( A )。
A. 静态成员函数
B. 非静态成员函数
C. 友元函数
D. 前面都不正确
析:友元函数不输入类成员,故不能那样调用。
11.对虚基类的定义,( B )。
A. 不一定要使用虚函数
B. 必须使用虚函数
C. 必须使用private
D. 必须使用public
12.假定CTest为一个类,并且构造函数的参数无缺省值,则执行CTest objTest语句时将自动调用该类的( A )。
A. 有参构造函数
B. 无参构造函数
C. 拷贝构造函数
D. 赋值重载函数
析:无缺省值既有默认值,例如A(int i=0,double=”hello”).
13.当一个类的某个函数被说明为virtual时,该函数在该类的所
有派生类中( A )。
A. 都是虚函数
B. 只有被重新说明时才是虚函数
C. 只有被重新说明为vittual时才是虚函数
D. 都不是虚函数
析:之后,派生类的该虚函数前的virtual关键字可加可不加
14.调用一个成员函数时,使用动态联编的情况是( B )。
A. 通过对象调用一虚函数
B. 通过指针
或引用调用一虚函数
C. 通过对象调用一静态函数
D. 通过指针或引用
调用一静态函数
析:记住,通过对象调用虚函数不会出现多态(通过指针或者
引用才会有多态性)
在构造函数里面调用虚函数不会出现多态
指定命名域调用不会出现多态
15.在派生类中能够直接访问基类的( D )。
A. 公有成员和私有成员
B. 保护成员和私有
成员
C. 不可访问的和私有的成员
D. 保护成员和公有
成员
二、判断正误题(本大题共10小题,每小题1分,共10分)判断
正误,在题后的括号内,正确的划上“√”错误的划上“×”。
1.friend属于类的存取权限。
(√)
2.重载函数要求函数有相同的函数名,但具有不同的参数个数或参数类型。(√)
3.常对象可以调用任意成员函数。
(×)
析:私有的和保护的不行
4.在类声明中不但可以说明成员函数的函数头,也可以定义函数体。(√)
析:这样将使该函数成为内联函数。
5.使用关键字class定义的类中缺省的访问权限是私有(private)的。(√)
6.构造函数和析构函数都不能重载。
(×)
析:构造函数可以重载
7.可以在类的构造函数中对静态数据成员进行初始化。
(×)
析:类头只是申明而已只是表明分配内存的方式并不分配内存,既然没有分配内存何来赋值。正确方式应是在实现文件中省略static关键字但要表明类型和作用域解析操作符来初始化。例如:在类A中声明了static int x;则要在实现文件中初始化,int A::x=1;
8. cout通常与显示器相连,cin通常与键盘相连。
(√)
9. IO流库重载的插入和析取运算符处理所有的数据类型。
(×)
10. ostrstream是向字符数组的输出流,istrstream是从字符数组的输入流。()
这道题暂时不太清楚对错,有谁知道告诉一下我
三、填空题(本大题共10小题,每小题1分,共10分)不写解答
过程,将正确的答案写在每小题的空格内。错填或不填均无分。
1.编译时多态性是通过虚函数实现的。
2.在C++中,如果类的名称是CTest,则此类的析构函数名称为
~CTese() 。
3.使用new建立的动态对象在不用时必须用 delete 删除,以便释放所占用空间。
4.友元函数用关键字 friend 说明。
5.使用C++风格的输入/输出时,在程序中必须包含头文件iostream (不是iostream.h)。
6. 执行语句cout<<"x86\082\n";后,输出结果为 x86 (注意并没有换行)。
7. 用new运算符申请动态对象时,系统将自动调用该对象的构造函数。
8. 定义内联函数的方法是在函数的返回值类型之前增加关键字inline 。
9. 在多重继承时,若欲使公共基类只在派生类中产生一个拷贝,则应在派生类中将该基类用关键字 virtual 。(例如class B:public virtual A;)
10. 在C++的I/O流类库中,预定义了4个流,即cin、cout、cerr 和clog,其中 cerr,clog 不可重定向。
四、程序阅读题(本大题共4小题,每小题5分,共20分)给出下面各程序的输出结果。
1.阅读下面程序,写出输出结果。
#include
using namespace std;
class CPoint
{
public:
CPoint(int x = 0, int y = 0) {
m_x=x, m_y=y;
}
int GetX() const
{
return m_x;
}
int GetY() const
{
return m_y;
}
void SetX(int x)
{
m_x = x;
}
void SetY(int y)
{
m_y = y;
}
private:
int m_x;
int m_y;
};
int main(void)
{
CPoint oPoint1;
const CPoint oPoint2(3, 4);
cout << oPoint1.GetX() << endl;
oPoint1.SetX(1);
cout << oPoint1.GetX() << endl;
oPoint1.SetY(2);
cout << oPoint1.GetY() << endl;
cout << oPoint2.GetX() << endl;
cout << oPoint2.GetY() << endl;
return 0;
}
上面程序的输出结果为:
1
2
3
4
2.阅读下面程序,写出输出结果。#include
int f(char *s)
{ char *p=s;
while(*p) p++;
return p-s;
}
void main(void)
{
cout< } 上面程序的输出结果为: 6 (其实就是一测字符串长度的程序)3.阅读下面程序,写出输出结果。#include using namespace std; class CTest { public: CTest() { m_iCount++; } ~CTest() { m_iCount--; } static int GetCount() { return m_iCount; } private: static int m_iCount; }; int CTest::m_iCount = 0; int main(void) { CTest obj1; cout << CTest::GetCount() << endl; CTest obj2; cout << obj2.GetCount() << endl; CTest obj3; cout << obj1.GetCount() << endl; CTest *p = new CTest; cout << p->GetCount() << endl; delete p; cout << CTest::GetCount() << endl; return 0; } 上面程序的输出结果为: 1 2 3 4 3 析:delete p时将自动调用其所指对象的析构函数。对于一般类型编译器有内置的释放内置方法,而对于用户自定义类型则无能为力,必须得调用其析构函数还销毁对象。 4.阅读下面程序,写出输出结果。 #include class Shape {public: Shape() { } virtual int Area()=0; }; class Circle:public Shape { int r; public: Circle(int c){ r=c; } int Area() { return int( 3.1415*r*r); } }; class Rectangle:public Shape { int h,w; public: Rectangle(int c, int d) { h=c; w=d; } int Area() { return h*w; } }; void fun(Shape &s) { cout< } void main() { Circle c(4); fun(c); Rectangle r(10,2); fun(r); } 上面程序的输出结果为: 50.264 20 析:本题的基类为虚基类。正如前面14道选择题一样,通过引用或指针调用虚函数时将引发多态。 五、程序改错题(本大题共2小题,每小题5分,共10分)指出下面程序中的错误,说明错误原因,并加以改正。 1.下面程序中有一处错误,请指出出错的行,说明错误原因,并加以改正。 #include //1 using namespace std; //2 class CBase //3 { //4 public: //5 virtual void Show() = 0; //6 }; //7 class CDerive:public CBase //8 { //9 public: //10 CDerive(int x = 0) //11 { //12 m_x=x; //13 } //14 void Show() //15 { //16 cout << m_x << endl; //17 } //18 private: //19 int m_x; //20 }; //21 int main(void) //22 { //23 CBase obj(10); //24 obj.Show(); //25 return 0; //26 } //27 24行有错,虚基类不能实例化! 2.下面程序中有一处错误,请指出出错的行,说明错误原因,并加以改正。 #include //1 using namespace std; //2 class CTest //3 { //4 public: //5 void CTest() //6 { //7 cout << "构造函数" << endl; //8 } ~CTest() //10 { //11 cout << "析造函数" << endl; //12 } //13 }; //14 int main(void) //15 { //16 CTest obj; //17 return 0; //18 }