您的当前位置:首页正文

c++试题B

2021-08-29 来源:星星旅游


一、判断题(每题1分,共10 分)

()1﹒在程序中,变量定义语句可以出现在程序的任何位置。

()2﹒说明函数原型时,必须指明每个参数的类型和名字,以及返回值类型。 ()3﹒说明函数原型时,形参列表中具有缺省值的形参的右边的形参数必须都具有缺省值。 ()4﹒声明和定义重载函数时,如果函数的形参完全相同,而函数的类型不同,则会引起歧义性错误。

()5﹒指针变量可以在定义时初始化,但初始化的值只能是该指针类型所指对象的地址值或NULL。

()6﹒用引用传递函数参数,将在函数作用域内直接使用变量或对象。

()7﹒基类中被说明为protected的成员,不允许其他的函数访问,但其派生类的成员函数可访问。

()8﹒若类B某成员函数定义为另一个类A的友元,则A类的所有成员函数可以直接访问类B的所有成员。

()9﹒构造函数和析构函数都可以被重载,其中析构函数还可能被定义为虚函数。

()10﹒指向常对象的指针往往用作函数的参数,目的是在保护形参指针所指对象,使它在函数执行过程中不被修改。

二、填空题(每空0.5 分,共10 分) 1.对象的封装可以理解为:

⑴将有关的和封装在一个对象中,形成一个基本单位,对象之间相互独立,互不干扰。 ⑵将对象一部分属性和功能设置为,使之受到保护,不允许其它对象访问它们。 ⑶把它的一部分属性和功能设置为,作为,以便与外界联系,接收外界消息。 2.一个类有个析构函数。析构函数不能具有和,但声明为虚函数。

3.在类定义中使用关键字static说明的数据成员被称为数据成员。它的特征是不管该类创建了多少个对象,而该数据成员只有一个,被该类的所有对象。

4.如果需要在派生类中访问基类的私有成员可以通过以下两种方法实现: ⑴在基类中增加将派生类需要访问的私有成员声明为。 ⑵将需要访问基类私有成员的派生类声明为基类的。

5.重载输入运算符>>时,其运算符函数的返回值类型应当是,第一操作参数类型也应当是,而第二操作参数应是输入类型的。

6.在C++中,编译时多态性是通过机制实现的。而运行时多态性是通过机制来实现的。 三、选择题(每空1 分,共20 分)

1. 在程序中,函数声明语句正确位置是()。 A.随便任何位置

B.不包含在另一函数中的任何位置 C.该函数使用前的任何位置

D.该函数使用前的任何位置,但不包含在另一函数中

2. 返回类型就是函数返回结果值的数据类型。返回类型可以是()。 A.除数组和类以外的任意数据类型

B.除数组和结构类型以外的任意数据类型 C.除数组类型以外的任意数据类型

D.除指针和引用类型以外的任意数据类型 3. 关于引用,下列的说法中错误的是()。

A. 引用是给被引用的变量取一个别名

B. 引用主要是用来作函数的形参和函数的返回值 C. 在声明引用时,要给它另开辟内存单元 D. 在声明引用时,必须同时使它初始化 4. 下面关于对象概念的描述中,()是错误的。 A. 对象就是C语言中的结构变量

B. 对象代表着正在创建的系统中的一个实体 C. 对象是一个状态和操作(或方法)的封装体 D. 对象之间的信息传递是通过消息进行的 5. 下列有关类和对象的说法中,()是不正确的。 A. 对象是类的一个实例

B. 任何一个对象只能属于一个具体的类 C. 一个类只能有一个对象

D. 类和对象的关系与数据类型和变量的关系相似 6. 引入内联函数的主要目的是()。 A.缩短程序代码,少占用内存空间

B.既可以保证程序的可读性,又能提高程序的运行效率 C.占用内存空间少,执行速度快 D.使程序的结构比较清晰

7. 下列关于重载函数在调用时选择的依据中,()是错误的。

A. 参数个数 B. 参数类型 C. 函数名字 D. 函数类型 8. ()不是构造函数的特性。 A. 构造函数的函数名与类名相同 B. 构造函数可以重载

C. 构造函数可以设置默认参数 D. 构造函数可以指定类型说明

9. 类的静态成员函数首先是一个成员函数,但它又不属于类的某一个对象。因此静态成函数的调用形式()。

A. 只能是类名::静态成员函数名([实参表]) B. 只能是对象名.静态成员函数名([实参表])

C. 最好是类名::静态成员函数名([实参表]),也可以是对象名.静态成员函数名([实参表]) D. 以上答案都不对

10.类的静态成员函数不属于类的某一个对象,它没有this 指针,()。 A. 因此在静态成员函数的定义中不允许访问类的非静态成员 B. 但在静态成员函数的定义中允许直接访问类的非静态成员 C. 但可以通过由参数传递的类对象访问类的非静态成员

11.若类X 为类Y 友元类,且类Y 是类Z 的友元类,则下面对类X、Y 和Z之间的关于友元关系的描述中,()是正确的

A.类Y 和类Z 不是类X 的友元类,类X也不是类Z 的友元类。 B.类Y 和类Z 不是类X 的友元类,而类X 是类Z 的友元类。

C.类Z 不是类X 的友元类,类Y 是类X的友元类,类X 不是类Z 的友元类。 D.以上答案都不对

12.下列对重载函数的描述中,()是错误的。 A. 重载函数中不允许使用默认参数

B. 确定重载函数调用的编译是根据参数表进行选择的 C. 不要使用重载函数来描述操作功能毫不相干的函数 D. 构造函数重载将会给初始化带来多种方式 13.对象的数据成员()在类的声明中赋初值。

A. 不可以 B. 可以 C. 只能 D. 与定义简单变量相同

14.运算符重载实际上是一种函数重载——运算符函数重载。被重载的运算符(),它们的操作数个数()。

A. 必须是系统预定义运算符 B. 只能是自定义的运算符

C. 既可以是自定义的运算符,也可以是系统预定义运算符 D. 必须不同 E. 必须相同

F. 可以相同,也可以不同

15.当保护继承时,基类的()在派生类中成为保护成员,不能通过派生类的对象来直接访问该成员。

A.任何成员 B.公有成员和保护成员 C.保护成员和私有成员 D.私有成员 16.基类的私有成员()。

A. 在以任何方式继承的派生类中都不能被直接访问 B. 在以任何方式继承的派生类中都能被直接访问 C. 只能在以保护方式继承的派生类中被直接访问 D. 只能在以公有方式继承的派生类中被直接访问 17.下列关于多继承二义性的描述中,()是错误。

A. 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性

B. 解决二义性的最常用的方法是使用类名::对成员名进行限定说明 C. 基类和派生类中同时出现同名函数,也存在二义性问题

D. 派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性

18.下列关于纯虚函数和抽象类的描述中,()是错误的。 A. 纯虚函数是一种特殊的虚函数,它没有具体的实现 B. 抽象类是指具有纯虚函数的类

C. 一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类 D. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 19.下列关于虚函数的描述中,()是正确的。 A. 虚函数是一个static类型的成员函数 B. 虚函数是一个非成员函数

C. 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数 D. 派生类的虚函数与基类的虚函数具有不同的参数个数和类型

四、程序理解题(第2小题10分,第1,3,4,5小题各6分,共34 分)

1. 假定要求下面程序的输出结果为“11/15”,其主函数中存在着三行语句错误,请指出错误语句行的行号并改正错误行。 #include

class Franction { // 定义分数类

int nume; // 定义分子 int deno; // 定义分母 public:

// 把*this化简为最简分数,具体定义在另外文件中实现 void FranSimp();

// 返回两个分数*this和x 之和,具体定义在另外文件中实现 Franction FranAdd(const Franction& x); // 置分数的分子和分母分别0 和1 void InitFranction() {nume=0; deno=1;}

// 置分数的分子和分母分别n和d

void InitFranction(int n, int d) {nume=n; deno=d;} // 输出一个分数

void FranOutput() {cout<void main() // 1 行 { // 2 行 Franction a,b,c; // 3 行 a.InitFranction(6,15); // 4 行 b.InitFranction(1); // 5 行 c.InitFranction(); // 6 行 c=FranAdd(a,b); // 7 行 cout<2. 下面的程序在编译链接时,程序的第21行main函数中B.Print();处出现了编译错误。在不修改main函数代码的前提下,需要对Point类的定义和实现代码进行三处修改,使程序能正确编译、链接和运行。

(1)请写出三处需要修改的代码的行号及修改后的正确代码。(6分) (2)请写出执行修改后程序所显示的结果。(4分)

#include // 1 class Point // 2 { // 3 public: // 4 Point(int x = 0, int y = 0) { X = x; Y = y; C = 0; } // 5 void Print(); // 6 private: // 7 int X, Y; // 8 int C; // 9 }; // 10 void Point::Print() // 11 { // 12 cout << X << \" \" << Y << endl; // 13 C = C + 1; // 14 } // 15 main() // 16

{ // 17 Point A; // 18 const Point B(10, 10); // 19 A.Print(); // 20 B.Print(); // 21 return 0; // 22 } // 23 3. 读懂程序,写出结果。 #include class Date { public:

Date(int y=2009,int m=1,int d=1){Year=y;Month=m;Day=d;} void PrintDate(){cout<int Year,Month,Day; };

class Time { public:

Time(int h=5,int m=30,int s=0){Houre=h;Minutes=m;Seconds=s;}

void PrintTime(){cout<int Houre,Minutes,Seconds; };

class Date_Time:public Date,public Time { public:

Date_Time(){};

Date_Time(int y,int mo,int d,int h=0,int mi=0,int s=0):Date(y,mo,d),Time(h,mi,s){} void PrintDate_Time(){PrintDate();PrintTime();} };

void main() {

Date_Time a,b(2002,10,1,6,20,0),c(2003,3,8,6,7); a.PrintDate_Time(); b.PrintDate_Time(); c.PrintDate_Time(); }

4. 完成程序 class A{ int a; public: A( ){a=0;}

① { } // 定义构造函数,用参数aa 初始化数据成员a };

main( ) {

② ; // 定义类A的指针对象p

③ ; // 用p指向动态对象并初始化为整数5 }

5. 以下程序的功能是:找出数组中的最小值并输出,请完成程序。 #include class sample { int x; public:

void setx( int x0) {x=x0;}

friend int fun( sample b[ ], int n) { int m= ① ; for(int i=0; iif(b[i].xvoid main() {sample a[6];

int arr[]={12,6,21,7,10,9}; for( int i=0;i<6;i++) a[i].setx(arr[i]);

cout<五、编程题(第1小题16分,第2小题10分,共26 分) 1. 根据下面类中成员函数的原型和注释写出它们的类外定义。 class Strings{

char*s; // 指向动态分配的字符串数组空间 int n; // 记录字符串长度 public:

Strings(char *str); // 构造函数,利用str 字符串长度初始化n, // 利用str 字符串初始化s所指的字符串空间

Strings(Strings& str); // 拷贝构造函数

Strings& operator=(Strings& str); // 实现str 赋值给*this的功能并返回*this Strings operator+(Strings& str); // 实现*this和str 中的字符串连接的功能 // 把连接结果存入临时对象并返回

int Lenth(){return n;} // 返回字符串长度 void Print(){cout<2. 有一圆环,其中小圆半径为3.5,大圆半径为8。编程定义一个circle类,含有私有变量半径r,能够初始化r、计算圆面积。主函数中通过定义2个对象(大圆和小圆)来计算出圆环的面积。

因篇幅问题不能全部显示,请点此查看更多更全内容