期中考试C+

更新时间:2023-03-18 08:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、单项选择题(20*2分)

1. 所谓多态性是指(B) A) 不同的对象调用不同名称的函数 B) 不同的对象调用相同名称的函数 C) 一个对象调用不同名称的函数 D) 一个对象调用不同名称的对象

2. 在int a=3,int *p=&a;中,*p的值是(D) A) 变量a的地址值 B) 无意义 C) 变量p的地址值 D) 3

3. 下列不能描述为类的成员函数的是(C)

A) 构造函数 B) 析构函数 C) 友元函数 D) 拷贝构造函数 4. 以下基类中的成员函数表示纯虚函数的是(A) A) virtual void tt()=0 B) voidtt(int)=0

C) virtual void tt(int) D) virtual void tt(int){}

5. 下面对静态数据成员的描述中,正确的是(B) A) 静态数据成员可以在类体内进行初始化

B) 静态数据成员可以直接用类名或者对象名来调用 C) 静态数据成员不能用private控制符修饰 D) 静态数据成员不可以被类的对象调用

6. 有关析构函数的说法不正确的是 ( B )。

A) 析构函数有且仅有一个 B) 析构函数和构造函数一样可以有形参 C) 析构函数的功能是用来释放一个对象 D) 析构函数无任何函数类型

7. 已知X类.则当程序执行到语句,X array[3];时,调用了( D )次构造函数。

A) 0 B) 1 C) 2 D) 3

8. 关于new运算符的下列描述中,( D )是错误的。 A) 它可以用来动态创建对象和对象数组

B) 使用它创建对象或对象数组,可以使用运算符DELETE删除 C) 使用它创建对象时要调用构造函数

D) 使用它调用对象数组时不许指定初始值

9. 可以用p.a的形式访问派生类对象p 的基类成员的a,其中a是( D )。

A)私有继承的公有成员 B)公有继承的私有成员 C)公有继承的保护成员 D)公有继承的公有成员 10. 下列描述中哪个是正确的( D)。 A) 私有派生的子类无法访问父类的成员

B) 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的

C) 私有派生类不能作为基类派生子类

D) 私有派生类的所有子孙类将无法继续继承该类的成员 11. 下列关于构造函数说法不正确的是( C )。 A)构造函数必须与类同名 B)构造函数可以省略不写

C)构造函数必须有返回值 D)在构造函数中可以对类中的成员进行初始化

12. 在重载一个运算符时,如果其参数表中有一个参数,则说明该运算符是( D )。

A) 一元成员运算符 B) 二元成员运算符 C) 一元友元运算符 D) B)和C)都可能 13. 类CStudent的拷贝构造函数的声明语句为 D 。 A) CStudent&CStudent (constCStudent other) B) CStudentCStudent(constCStudent other) C) CStudent (CStudent *other) D) CStudent (constCStudent&other)

14. 对友元(friend)不正确的描述是: D 。 A) 友元关系既不对称也不传递。

B) 友元声明可以出现在private部分,也可以出现在public部分。 C) 整个类都可以声明为另一个类的友元。

D ) 类的友元函数必须在类的作用域以外被定义。

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

C) 一个基类说明中有纯虚函数,该基类的派生类不再是抽象类。 D) 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。

16. 关于动态内存分配,对delete运算符的下列说法中, C 是错误的

A) 应与new运算符配合使用。 B) 可以在类的成员函数中使用。

C) 对同一个指针变量可任意多次使用该运算符。

D) 若a是一个二维数组。则delete []a;可删除a所占用的存储空间。 17. 关于运算符重载下列叙述正确的是 A 。 A) 重载不能改变算数运算符的结合性。 B) 重载可以改变算数运算符的优先级。 C) 所有的C++运算符都可以被重载。 D) 运算符重载用于定义新的运算符。 18. 下列叙述中,正确的是 B 。

A) 虚函数必须在派生类中定义,基类不需定义。

B) 一个基类定义的虚函数,该类的所有派生类都继承并拥有该函数。 C) 派生类中重定义虚函数时,参数表必须改变。 D) 虚函数的返回类型必须是void。 19. 设有类的定义:class M{ public: int *v; M(){ }

M(inti){v=new int(i);}

};

以下定义该类的对象m,并对其成员v初始化的正确操作是 D 。

A) M m; m.v=10; B) M m; *m.v=10; C) M m; m.*v=10; D) M m(10);

20. 已知print()函数是一个类的常成员函数,它无返回值,下列表示中, A 是正确的。

A) void print( ) const B) const void print( ) C) voidconst print( ) D) void print (const)

二、判断题(0.5分*10)(对的打√,错的打╳)

1. 友元函数用于允许一个函数访问不相关类的私有部分。 ( √ ) 2. 构造函数可以被继承。 ( ╳ )

3. 动态的多态性可以通过基类指针调用虚函数实现。 ( √ ) 4. 重载函数必须有不同的参数列表。 ( √ )

5. 可以用delete释放不是用new运算符分配的内存。 ( ╳ ) 6. 类成员的默认访问模式是private。 ( √ )

7. 在类Time中的析构函数可以声明为:void ~Time(int); ( ╳ ) 8. Const数据成员在类的外部初始化。 ( ╳ ) 9. 只有单目运算符和双目运算符才能重载。 (╳ ) 10. C++中,在定义函数时的参数是“形参”,在调用函数时的参数是“实参”。 ( √ )

三、填空题(10*1分)

1. 继承的方式包含公有继承、私有继承和(保持继承)三种。 2. 面向对象的程序设计的主要特征包括抽象、封装、(继承)和(多态)。 3. 常引用的标识符是(const&),使用常引用的好处在于(保护数据,用作形参还能提高程序运行效率。),

4. 有一种类,不能定义对象,只能被继承,称之为(抽象类),这种类至少具有一个(纯虚函数)。

5. 在已经定义了整型指针p后,为了得到一个包括10个整数的数组并由p所指向,应使用语句(int *p = new int[`10] 。

6. 在C++中,访问一个指针所指向的对象的成员所用的指向运算符是( ->)。

7. C++语言支持的两种多态性分别是编译时的多态性和(运行(或动态))的多态性。

四、程序阅读题(4小题,共15分)

1、(3分) 下列程序的运行结果 1342 。 #include

using namespace std; class A {

public:

A(){cout<<\ ~A(){cout<<\};

class B:public A { public:

B(){cout<<\ ~B(){cout<<\};

void main() {

B b; }

2、(3分) 下列程序的执行结果为 n=11, n=12 #include

using namespace std; void main() {

int n=10; int* pn=&n; int* &rn=pn; (*pn)++;

cout<<\ (*rn)++;

cout<<”n=”<

3、(3分) 下列程序的执行结果为 A::a=1 A::a=1

A::a=1 。 #include

using namespace std; class A {

private:

int a; public:

A(int x): a(x){ }

void Show() const { cout<< \ };

。 class B: public A {

private:

int b; public:

B(int x, int y): A(x), b(y){ }

void Show() const { cout<< \ };

class C: public A {

private:

int c; public:

C(int x, int y): A(x), c(y){ }

void Show() const { cout<< \ };

int main() {

A *p; A a(1); B b(1, 6); C c(1, 8); p = &a; p->Show();

p = &b; p->Show();

p = &c; p->Show(); system(\

return 0; }

4 、 (6分) 写出下列程序的执行结果,并说明该程序有什么问题,应该如何修改程序?

Constructor of CBase. m_data=abcd Constructor of CDerived. m_data =abcd Destructor of CBase. m_data=abcd

问题在于析构过程中只调用了基类的析构函数。正确的析构应该是先执行CDerived的析构函数,再执行CBase的析构函数。在~CBase()加上virtual关键字即可。 classCBase {

本文来源:https://www.bwwdw.com/article/kyld.html

Top