当前位置:文档之家› C++程序设计练习题与答案

C++程序设计练习题与答案

C++程序设计练习题一、填空题1.对象的三大基本特性分别为多态性、( )、封装性。

2.赋值运算符应重载为( )函数。

3.用( )声明的基类称为虚基类。

4.用( )声明的函数称为虚函数。

5.派生类对基类继承控制访问有三种。

派生类可以定义其基类中不具备的( )。

6.静态成员是对象的成员,( )函数不是类的成员。

7.在函数体之前加( )关键字可以防止覆盖函数改变数据成员的值。

8.一个const对象只能访问( )成员函数。

9.使用友元函数是为了提高程序效率,且节约了( )开销。

10.类名为“ClassName”的类,其拷贝构造函数的原型说明是( )。

11.由关键字private、public和protected限定成员的访问权限分别是( )、( )和( )。

缺省关键字时成员的访问权限为( )。

12.如果想要公共基类在派生类中只有一个拷贝,就要将公共的基类说明为( );如果虚基类没有默认构造函数,就必须在每一个派生类的构造函数中都要调用虚基类的( )函数。

13.静态成员函数是使用关键字( )说明的成员函数。

14.一个函数的原型声明为“void FunName(int=0, double=0, char='x');”,则调用FunName函数的方法共有( )种。

15.编译时多态性是通过( )实现的;运行时多态性是通过( )实现的。

16.C++通过( )实现编译时多态性,通过( )实现运行时多态性。

17.在C++中,声明类的关键字是( )。

18.声明C++模板的关键字是( )。

19.调用函数原型声明为“void FunName(short, int=0, float=1.0);”的方法有( )种。

20.处理C++异常的方法:采用( )结构。

21.用关键字( )、( )和( )限定的成员,其访问权限分别为:公有的、私有的和保护的。

缺省关键字时,成员的访问权限为( )。

22.在C++中,处理( )的方法是采用try-catch结构。

23.在C++中,用关键字( )说明内置函数。

24.在C++中,声明友元函数的关键字是( )。

25.将公共基类说明为( )时,多重派生过程中公共基类在派生类中就只有一个拷贝了。

26.在C++中,如果函数调用在前、定义在后,就必须先对函数进行( )。

27.在成员函数头之后、函数体之前加( )修饰的成员函数称为类的常成员函数。

28.包含纯虚函数的类称为抽象类,这种类只能用作( )来派生新类。

由于抽象类的特殊性,我们可以说明抽象类的( ),但不能说明抽象类的( )。

29.说明函数类型为“double”、函数名为“virfun”且无参数的纯虚函数的表达形式为( )。

30.说明静态成员要使用关键字( )。

31.当函数调用在前定义在后时,必须先对函数进行( )说明。

32.类名为“ClassN”的类的拷贝构造函数的函数原型说明为( )。

33.抽象类是包含( )的类,必须注意:不能说明抽象类的( ),但可说明抽象类的( )。

34.流插入运算符<<只能重载为友元函数,重载流插入运算符<<的函数名为( )。

35.要防止在该成员函数中改变数据成员的值,就要在类的成员函数名之后、函数体之前加上关键字( )。

36.类和对象的关系可表述为:类是对象的( ),而对象则是类的( )。

37.在C++中,三种继承方式的说明符号为( )、( )和( ),如果不加说明,则默认的继承方式为( )。

38.如果只想保留公共基类的一个复制,就必须使用关键字( )把这个公共基类声明为虚基类。

39.若要把void myfun( )定义为类A的友元函数,则应在类A的声明中加入语句( )。

40.类的静态成员分为( )和( )。

41.运算符重载要求保持其原来的操作数个数、( )、( )和语法结构。

42.通过关键字( )可以声明模板,通过关键字( )指定函数模板的类型参数。

43.请列出C++中两种用户自定义的数据类型:( )、( )。

44.构造函数的作用是( )。

45.后置自增运算符“++”重载为类的成员函数(设类名为ClassName)的形式为( )。

二、单选题1.继承机制的作用是( )A) 信息隐藏B) 数据封装C) 定义新类D) 数据抽象2.类的析构函数的作用是( )A) 一般成员函数B) 类的初始化C) 对象的初始化D) 删除对象创建的所有对象3.类的析构函数是在( )调用的。

A) 类创建时B) 创建对象时C) 删除对象时D) 不自动调用4.在( )情况下适宜采用inline定义内联函数。

A) 函数体含有循环语句B) 函数体含有递归语句C) 函数代码少、频繁调用D) 函数代码多、不常调用5.如果类A被说明成类B的友元,则( )A) 类A的成员即类B的成员B) 类B的成员即类A的成员C) 类A的成员函数不得访问类B的成员 D) 类B不一定是类A的友元6.在类中声明转换函数时不能指定( )A) 参数B) 访问权限C) 操作D) 标识符7.在公有继承的情况下,基类成员在派生类中的访问权限( )A) 受限制B) 保持不变C) 受保护D) 不受保护8.在C++类体系中,不能被派生类继承的有( )A) 转换函数B) 构造函数C) 虚函数D) 静态成员函数9.假定ClassN为一个类,则执行“ClassN x;”语句时将自动调用该类的( )A) 有参构造函数B) 无参构造函数C) 拷贝构造函数D) 赋值构造函数10.C++语言建立类族是通过( )A) 类的嵌套B) 类的继承C) 虚函数D) 抽象类11.重载一元运算符--为类A的成员运算符,若有类A的对象obj,则表达式--obj被C++编译器解释为( )。

A) obj.operator -- ( ) B) operator -- (obj) C) obj::operator -- ( ) D) obj:operator -- ( )12.以下有四种关于类的说法,其中不正确的是( )。

A) 构造函数可以指定参数,但不能指定函数类型B) 一个类可以有多个构造函数C) 析构函数不可以指定参数,但可以指定函数类型D) 一个类只能有一个析构函数13.面向对象程序设计讲求封装性,在C++中封装是借助于( )实现的。

A) 结构B) 数组C) 类D) 函数14.下面有四种关于类的说法,其中不正确的是( )。

A) 一个类可以有多个构造函数B) 析构函数不可以指定函数类型,但可以指定函数参数C) 一个类只能有一个析构函数D) 在一个类中可以说明其它类的对象15.下列有关基类的叙述中不正确的是( ),前提为“公有派生”。

A) 基类的公有成员在派生类中仍然是公有的B) 基类的保护成员在派生类中仍然是保护的C) 基类的私有成员在派生类中仍然是私有的D) 基类的私有成员在派生类中是不可访问的16.以下有四种关于友元的描述,其中错误的是( )。

A) 类A的友元类B的成员函数都是类A的友元函数B) 友元函数可以访问该类的私有数据成员C) 类与类之间的友元关系可以继承D) 友元可以提高程序的运行效率17.C++的封装性是借助于( )实现的。

A) 函数B) 数组C) 结构D) 类18.要将--重载为类ClassN的后置友元运算符,那么,要在类中添加的原型说明为( )。

A) friend ClassN operator -- (ClassN &, int); B) friend ClassN operator -- (ClassN &);C) friend ClassN operator -- (int); D) friend ClassN operator -- ( );19.在公有派生时,下列描述中不正确的是( )。

A) 派生类的对象可以赋给基类的对象B) 派生类对象的地址可以赋给指向基类的指针C) 派生类的对象可以初始化基类的引用D) 当基类的指针指向派生类对象时,通过该指针可以直接访问派生类中的成员20.以下关于继承成员的访问属性的叙述中,不正确的是( )。

A) 基类的保护成员在私有派生类中是私有的B) 对基类成员的访问必须没有二义性C) 基类的保护成员在保护派生类中是保护的D) 基类的保护成员在派生类中是保护的三、程序改错题(改正下列类中的错误)1.class ClassN{private: int nmember;ClassN pmember;public: ClassN( );int ClassN(int x);}2.void main(){char c[] = new char [20];delete c;}3.class MyClass{private: int n=1;MyClass pO;public: MyClass(int a = 0);void ~MyClass(int a);};4.#include <iostream>using namespace std;void main(){int & par = new int [6];delete par;cout >> "主函数End!" << endl; }5.#include <iostream>using namespace std;void main(){long & par = new long [9];delete par;cout << "主函数End!" << Endl; }6.CLass CN{private: long n;CN pobj;public: CN();void CN(int X);};四、分析程序输出题1.#include <iostream>using namespace std;class A{public:A() { cout<<"constructing A "<<endl; }~A() { cout<<"destructing A "<<endl; } };class B: public A{public:B() { cout<<"constructing B "<<endl; }~B() { cout<<"destructing B "<<endl; } };class C : public B{public:C() { cout<<"constructing C "<<endl; }~C() { cout<<"destructing C "<<endl; } };void main(){ C c1; }2.#include <iostream>using namespace std;void fun(int &a, int &b){int p; p=a; a=b; b=p;}void exchange(int &a,int &b,int &c){if(a<b) fun(a,b);if(a<c) fun(a,c);if(b<c) fun(b,c);void main(){int a=12,b=89,c=56;exchange(a,b,c);cout<<"a="<<a<<",b="<<b<< ",c="<<c<<endl;}3.#include <iostream.h>class TC {private:int num;public:TC();int TEST() { return num; }~TC();};TC::TC() { num=0; }TC::~TC(){ cout<<"Destructor is active"<<endl; }void main(){TC tarr[5];cout<<"Exiting main"<<endl;}4.#include <iostream.h>class CBase{private: int n;public: CBase(int m = 0) { n = m; }virtual void print( ) { cout << "Inside CBase " << n << endl; } };class CDrive: public CBase{private: int n;public: CDrive( ) { n = 0; }CDrive(int a, int b) : CBase(a) , n(b) { }void print( ) { cout << "Inside CDrive " << n << endl; }void main( ){CBase b1, b2(99), *pb;CDrive dd(11, 22);pb = &b1;pb->print( );pb = &b2;pb->print( );pb = &dd;pb->print( );pb->CBase::print();}5.#include <iostream.h>class CTest{private:long num;public:CTest( );~CTest( );};CTest::CTest( ) { num = 0; }CTest::~CTest( ) { cout << "调用析构函数" << endl; }void main( ){CTest cobj;cout << "退出主函数" << endl;}6.#include <iostream.h>class CN{private: int n;public: CN(int i) { n=i; }operator int() { return n; }};void main(){CN cobj(123);cout<<cobj<<endl;}7.#include <iostream.h>void main( ){int num = 100;int & ref = num;cout << ref << endl;ref = ref + 100;cout << num << endl;num = num + 100;cout << ref << endl;}8.#include <iostream.h>class CName{private: long num;public: CName( );~CName( );};CName::CName( ) { num = 0; }CName::~CName( ) { cout << "调用析构函数" << endl; }void main( ){CName carr[2];cout << "退出main" << endl;}9.分析下列程序并写出程序的运行结果。

相关主题