加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++复习卷

(2015-06-09 15:59:27)
标签:

股票

一、单项选择题(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) void tt(int)=0

C) virtual void tt(int)

D) virtual void tt(int){}

5.         下面对静态数据成员的描述中,正确的是(B

A) 静态数据成员可以在类体内进行初始化

B) 静态数据成员可以直接用类名或者对象名来调用

C) 静态数据成员不能用private控制符修饰

D) 静态数据成员不可以被类的对象调用

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

A) 析构函数有且仅有一个         B) 析构函数和构造函数一样可以有形参

C) 析构函数的功能是用来释放一个对象  D) 析构函数无任何函数类型

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

A)          B) 1       C) 2        D) 3

8.         关于new运算符的下列描述中,(   )是错误的。

A) 它可以用来动态创建对象和对象数组

B) 使用它创建对象或对象数组,可以使用运算符DELETE删除

C) 使用它创建对象时要调用构造函数

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

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

A)私有继承的公有成员     B)公有继承的私有成员

C)公有继承的保护成员     D)公有继承的公有成员

10.     下列描述中哪个是正确的(    D

        A) 私有派生的子类无法访问父类的成员

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

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

        D) 私有派生类的所有子孙类将无法继续继承该类的成员

11.     下列关于构造函数说法不正确的是(   )。

  A)构造函数必须与类同名      B)构造函数可以省略不写

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

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

   A) 一元成员运算符                      B) 二元成员运算符

   C) 一元友元运算符                      D)  B)C)都可能

13.     CStudent的拷贝构造函数的声明语句为    D   

A) CStudent  &CStudent (const CStudent other) 

B) CStudent  CStudent(const CStudent other)

C) CStudent  (CStudent *other)            

D) CStudent  (const CStudent &other)

14.     对友元(friend)不正确的描述是: D      

A) 友元关系既不对称也不传递。

B) 友元声明可以出现在private部分,也可以出现在public部分。

C) 整个类都可以声明为另一个类的友元。

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

15.     关于纯虚函数和抽象类的描述中,错误的是     C     

A) 纯虚函数是一种特殊的虚函数,它没有具体的实现。

B) 抽象类是指具有纯虚函数的类。

C) 一个基类说明中有纯虚函数,该基类的派生类不再是抽象类。

D) 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。

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

A)     应与new运算符配合使用。

B)     可以在类的成员函数中使用。

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

D)     若a是一个二维数组。则delete []a;可删除a所占用的存储空间

17.     关于运算符重载下列叙述正确的是    A    

A)     重载不能改变算数运算符的结合性

B)     重载可以改变算数运算符的优先级。

C)     所有的C++运算符都可以被重载。

D)     运算符重载用于定义新的运算符。

18.     下列叙述中,正确的是        

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

B)     一个基类定义的虚函数,该类的所有派生类都继承并拥有该函数。         

C)     派生类中重定义虚函数时,参数表必须改变。

D)     虚函数的返回类型必须是void

19.     设有类的定义:class M{

                   public:

                          int *v;

                          M(){ }

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

                    };

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

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)  void print( ) const

       B)  const void print( )

       C)  void const 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<<"1";}

 ~A(){cout<<"2";}

};

class B:public A

    

public:

 B(){cout<<"3";}

 ~B(){cout<<"4";}

};

void main()

{

b;

}

 

 

2(3 下列程序的执行结果为      n=11, n=12     

#include

using namespace std;

void main()

{

 int n=10;

 int* pn=&n;

 int* &rn=pn;

 (*pn)++;

 cout<<"n="<<n<<endl;

 (*rn)++;

 cout<<”n=”<<n<<endl;

}

 

 

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 << "A::a=" << a << endl; }   

};

class B: public A

{

private:

    int b;                   

public:

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

    void Show() const { cout << "B::b=" << b << endl; }   

};

class C: public A

{

private:

int c;                

public:

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

    void Show() const { cout << "C::c=" << c << endl; }    

};

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("PAUSE");     

       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关键字即可。

class CBase {

public:

CBase(int i)

  { m_data = i;

 cout << "Constructor of CBase. m_data=" << m_data <<endl;

 }

      ~CBase()

{ cout << "Destructor of CBase. m_data=" << m_data <<endl; }

protected:

 int m_data;

};

 

class CDerived: public CBase

{

public:

CDerived(const char *s): CBase(strlen(s))

 { m_data = new char[strlen(s) + 1];

strcpy(m_data, s);

cout << "Constructor of CDerived. m_data = " << m_data << endl;

}

~CDerived()

delete m_data;

cout << "Destructor of CDerived. m_data = " << m_data <<endl;

}

 

private:

 char  *m_data;

};

 

int main()

{

    CBase  *p ;

p = new CDerived (“abcd”); 

delete p;

 

    return 0;

}

 

五、编程题

1、(15分)设计一个模板,用于求一个数组的最小值。其中数组的元素个数是10,元素的值是随机的。\

(要求:包括完整的程序代码,头文件,函数模板的定义,main()中调用模板)

2、(15分)定义一个长方形(Rectangle)类,包括长度(lenth)和宽度(width)数据成员,重载“<”“>”运算符,用来实现两个长方形比较面积,例如两个长方形R1R2,如果R1面积小于R2,则R1返回true,否则返回false。重载“==”运算符,如果两个面积相同,则返回true,否则返回false

(要求:定义了类,且包含三个运算符重载函数,main()中包括简单示例,调用重载后的运算符)

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有