C++习题及答案(共25页).doc
精选优质文档-倾情为你奉上第一、二章习题1 关于C+语言,下列说法不正确的是A C+具有简洁、高效和接近汇编语言的特点B C+本身几乎没有支持代码重用的语言结构C C+语言不是一种纯面向对象的语言D C+支持面向对象的程序设计,这是它对C的重要改进B2 使用关键字_说明的函数为内联函数。inline3 C+支持两钟多态性,即_和_。编译时的多态性运行时的多态性4 在下面横线处填上适当字句,使程序输出结果为5,10# include <iostream.h>void main()_int n=5;int& _=n;ref=ref+5;cout<<n<<”,”<<ref;constref5 const int *p;表明A p本身是常量B p指向一个固定的int类型的地址,而p的内容可以修改C p只能指向一个整型常量D p只能指向一个被const修饰的int类型的常量C6 数据封装给数据提供了与外界联系的_,只有通过这些_,使用规范的方式,才能访问数据。标准接口 接口7 在下面横线处填上适当字句,使程序完整。int arr=1,2,3,4,5;_index(int i)return ai;void main()index(3)= _;/将a3改为6int &68 #include <iostream.h>void main()int *p,i,j;cin>>j;/输入4p=new intj;if(!p)cout<<”Allocation errorn”;for(i=0;i<j;i+)pi=i;for(i=0;i<j;i+)cout<<pi<<“ “;cout<<endl;delete p;输出为:4(这是输入的数据)01239#include <iostream.h>void comp(const int&,int&);int main()int n=6,t=10;cout<<”n=”<<n<<”,t=”<<t<<endl;comp(n,t);cout<<”n=”<<n<<”,t=”<<t<<endl;return 0;void comp(const&in1,int &in2)in2=in1*10+in2;输出为:n=6, t=10n=6,t=7010 下列属于C+头文件约定使用的扩展名的是i. .cppii. .hppiii. .civ. .c+B11 C+提供了一种新的注释方式:从“/”开始,直到_,都被计算机当做注释。行尾12 在C+中,多态性被直观地称为“_”。一个名字,多个函数13 #include <iostream.h>void addsub(int&,int&);void main()int a=10,b=15;addsub(a,b);cout<<”a=”<<a<<”,b=”<<b;void addsub(int &m,int &n)int temp=m;m=m*n;n=temp-n;输出为:a=150,b=-514 #include <iostream.h>void main()int a22=2,4,6,8;int *pa2;pa0=a0;pa1=a1;for(i=0;i<2;i+)for(j=0;j<2;j+,pai+)cout<<“a”<<i<<“ ”<<j<<“=”<<*pai<<endl;输出为:a00=2a01=4a10=6a11=815 #include <iostream.h>#include <iomanip.h>main()cout<<setfill(*)<<setw(2)<<21<<endl<<setw(3)<<21<<endl<<setw(4)<<21<<endl;输出为:21*21*2116 C+有几种联编i. 1种ii. 2种iii. 3种iv. 4种B17 由于引用不是变量,所以不能说明引用的_,也不能说明数据类型为引用数组或是指向引用的指针。引用18 函数原型标识一个函数的_,同时也标识该函数参数的_和_。返回类型个数类型19 #include <iostream.h>void f()static int i=15;i+;cout<<”i=”<<i<<endl;void main()for(int k=0;k<2;k+)f();输出为:i=16i=1720 #include <iostream.h>#include <iomanip.h>main()cout<<hex<<20<<endl;cout<<oct<<10<<endl;cout<<setfill(x)<<setw(10);cout<<100<<”aa”<<endl;return 0;输出为:1412xxxxxxx144aa21 #include <iostream.h>int fun(int n1,int n2)return n1*n2;float fun(int f1,float f2)return f1*f2;void main()int a=10;int b=2.5;float c=2.55;float d=5.52;cout<<fun(a,b)<<endl;cout<<fun(c,d)<<endl;输出为:2011.0422 与标准错误输出设备相关联(缓冲方式)的,由C+流库预定义的流是_。clog23 C+的流类库预定义的,与标准输出设备相关联的流是i. cinii. coutiii. cerriv. clogB第三章习题及答案9 缺省的析构函数的函数体是A 不存在的B 随机产生的C 空的D 无法确定的C10 以下说法中正确的是A 一个类只能定义一个构造函数,但可以定义多个析构函数B 一个类只能定义一个析构函数,但可以定义多个构造函数C 构造函数与析构函数同名,只是名字前加了一个波浪号()D 构造函数可以指定返回类型;而析构函数不能指定任何返回类型,即使是void类型也不可以B11 不能在C+中提供封装的关键字是A classB structC typeD unionC12 由于数据隐藏的需要,静态数据成员通常被说明为A 私有的B 保护的C 公有的D 不可访问的A13 在类中说明的任何成员都不能用_、_和_关键字进行修饰。extern autoregist14 构造函数是和_同名的函数,但要在后者的名字之前冠有一个_,以区别于前者。析构函数波浪号 15 用关键字static修饰的成员称为_。静态成员16 已知AA是一个类,则AA *a2;声明了一个_数组。类对象指针17 拷贝初始化构造函数用对它所在类的_作为参数。引用18 指出下面程序段中的错误,并说明出错原因。/str1.h#include <iostream.h>#include <string.h>class strprivate:char *string;public:str(char* s)string=new charstrlen(s)+1;strcpy(string,s);str()cout<<”Delete”<<endl;delete string;void print()cout<<string<<endl;#include “str1.h”void main()str s1=”student”;str s2=s1;s1.print();s2.print();指针悬挂问题24 指出下面程序段中的错误,并说明出错原因。class Locationpublic:void init(int initX,int initY);private:int X=1;public:int getX();private:int y;不能采用这种方式初始化25 指出下面程序段中的错误,并说明出错原因。class Testprivate: int num;protected: int p;void fun()Test m;int x=m.p;类之外定义的函数不能访问类的保护成员26 指出下面程序段中的错误,并改正。class testint x;test *ptr=new test2;delete ptr;应为:delete ptr;27 在下面横线处填上适当字句,完成类的定义。class Tpublic: void init(int initx)x=initx;int getx()_;/取x值private: _;return xint x28 在下面横线处填上适当字句,完成类中成员函数的定义。class ABCint n;float f;public: ABC(int,float);ABC(ABC&);ABC:ABC(_)n=num;f=f1;ABC:ABC(ABC&t)n=_;f=t.f;int num,float f1t.n29 #include <iostream.h>class Apublic: static int x;int y;int A:x=15;void main()A a;cout<<A:x<<endl;cout<<a.x<<endl;输出为:151530 class testprivate: int num;public: test();int get()return num;test();test:test()num=0;test:test()cout<<”Destructor is active”<<endl;void main()test t2;cout<<”Exiting main”<<endl;输出为:Exiting mainDestructor is activeDestructor is active31 #include <iostream.h>class salaryint x,y;static int n;public: salary(int b):x(b)void f(double i)y=x*i;static void g(int p)n=p;int h()constreturn(x+y+n);int salary:n=100;void main()salary s1(1000),s2(2000);s1.f(0.2);s2.f(0.15);salary:g(400);cout<<”s1=”<<s1.h()<<”,s2=”<<s2.h()<<”n”输出为:S1=1600,S2=270032 #include <iostream.h>class tint x;float y;public: t(int n)x=n;t(int n,float f)x=n;y=f;int f()return x;float g()return y;t one2=3,4;t two2=t(3,5.5),t(7,8.8);void main()for(int i=0;i<2;i+)cout<<“one”<<i<<“=”<<onei.f()<<endl;cout<<endl;for(int i=0;i<2;i+)cout<<“two”<<i<<“=(”<<twoi.f()<<”,”<<twoi.g()<<”)”<<endl;输出为:one0=3one1=4two0=(3,5.5)two1=(7,8.8)33 说明友元函数使用关键字i. friendii. staticiii. constiv. volatileA34 指向类X中类型为type的数据成员的指针的说明形式为i. type X:*pointerii. X:type *pointeriii. Type *X:pointeriv. X:*type pointerA35 有关类作用域,下列说法中不正确的是i. 说明类时使用的一对花括号形成所谓的类作用域ii. 类作用域不包含类中成员函数的作用域iii. 类作用域中说明的标识符只在类中可见iv. 在可能出现两义性的情况下,必须使用作用域限定符“:”B36 形如X:X(X&)的构造函数称为i. 拷贝函数ii. 复制函数iii. 初始化构造函数iv. 拷贝初始化构造函数D37 友元关系不具有_,即当说明类A是类B的友元时,类B不一定是类A的友元。交换性38 new和_一同起作用,delete与_一起工作。构造函数析构函数39 指出下列程序段中的错误,并改正。class Bbprivate:int n;float f;public:Bb(int n1,float f1)n=n1;f=f1;Bb(Bb b)n=b.n;f=b.f;应为:Bb(Bb &b)n=b.n;f=b.f;40 指出下面程序段中的错误,并改正。class testpublic: static int x;int test.x=10;应为:int test:x=10;41 在下面横线处填上适当字句,完成类中成员函数的定义。class Aprivate: int x;float y;public: A (int aa,float b)x=_;/用aa初始化xy=_;/用b初始化y;aab42 #include <iostream.h>class Aprivate: int a,b;public: A(int m,int n)a=m;b=n;void fun()cout<<a<<”,”<<b<<endl;void fun()constcout<<a<<”:”<<b<<endl;void main()A a(5,8);a.fun();const A b(8,5);b.fun();输出为:5,88:543 下列关于封装的说法中正确的是i. 在C+中,封装是借助于函数达到的ii. 封装不要求对象具备明确的功能iii. 在数据封装的情况下,用户可以直接操作数据iv. 封装是将一组数据和与这组数据有关的集合组装在一起,形成一个能动的实体D44 定义的内容允许被其它对象无限制地存取的是i. private部分ii. protected部分iii. public部分iv. 以上都不对C45 析构函数不用于i. 在对象创建时执行一些清理任务ii. 在对象消失时执行一些清理任务iii. 释放由构造函数分配的内存iv. 在对象的生存期结束时被自动调用A46 静态成员函数i. 只能通过对象名(或指向对象的指针)访问该对象的静态成员ii. 只能通过对象名(或指向对象的指针)访问该对象的非静态成员iii. 可以被说明为虚函数iv. 有this指针B47 关于下面程序段,说法正确的是class Aprivate: int n;public: A(A&);A:A(A&a)n=a.n;A. A obj2(obj1);用对象obj1初始化具有相同类类型的对象obj2B. A obj2(obj1);用对象obj2初始化具有相同类类型的对象obj1C. A(A&a)也可以不使用引用参数而仍然是复制初始化构造函数D. A(A&a)不能访问对象的私有成员A48 已知A是一个类,则对于A x=2;编译器将其解释为_。A x(2)49 结构是_的一种特例,其中成员在缺省情况下是_的。类,公有50 友元在_中说明,其名字的作用域在_。类类外51 指出下面程序段中的错误,并说明出错原因。class A public: int a;void fa(void)void fb(void);void (A:*p)(void);p=A:fa; A x, *px=new A;(x. *p)(); px->*p();应为:(px->*p)();52 在下面横线处填上适当字句,使其输出结果为25,10。#include <iostream.h>class Locationint X,Y;public: _;int GetX()return X;int GetY()return Y;void Location:init(int k,int t)(X=k;Y=t;)void main()Location a;a.init(25,10);_;/输出对象a的数据成员X和Y的值。void init(int k, int t)cout<<a.GetX()<<”,”<<a.GetY()53 在下面横线处填上适当字句,使程序输出结果为:x=10,y=5x=5,y=10Delete x=5,y=10Delete x=10,y=5#include <iostream.h>class ttprivate: int x,y;public: tt(int a, int b)x=a; y=b;_;tt() _;void main()tt arr2=tt(10,5),tt(5,10);cout<<”x=”<<x<<”,y=<<y<<endlcout<<”Delete x=”<<x<<”,y=”<<y<<endl54 #include <iostream.h>class ConstFunpublic: const int f5()return 5;int obj()return 3;void main()ConstFun a;const int i=a.f5();int x=obj();cout<<i<<” “<<x<<endl;const ConstFun b;int j=b.f5();cout<<j<<endl;输出为:53555 运行下面的程序,写出当输入15,12时的结果#include <iostream.h>class Rectangeint width,length;public: Rectange(int x,int y)length=x;width=y;void show()cout<<”The length is:”<<length<<endl;cout<<”The width is:”<<width<<endl;cout<<The area is:”<<width *length<<endl;void main()int m,n;cout<<“Input the length and the width!”<<endl;cin>>m;/输入15cin>>n;/输入12Rectangle r(m,n); r.show();输出为:Input the length and width15 12(这是输入数据)The length is:15The width is:12The area is:18056 #include <iostream.h>class myclassint val;public: myclass(int i=0)val=I;myclass(myclass& cp);void set(int i);void print();myclass();myclass:myclass(myclass& cp)val=cp.val;cout<<”Hi.val=”<<val<<endl;void myclass:set(int i)val=I;void myclass:print()cout<<”This Print val=”<<val<<endl;myclass:myclass()cout<<”Destructor for val=”<<val<<endl;myclass myfun(myclass obj)obj.print();obj.set(10);return obj;void gFun()myclass my(5),ret;ret=myfun(my);void main()gFun();cout<<”Exiting main”<<endl;输出为:Hi.val=5This print val=5Hi.val=10Destructor for val=10Destructor for val=10Destructor for val=10Destructor for val=5Exiting main57 类的静态成员i. 是指静态数据成员ii. 是指静态成员函数iii. 为该类的所有对象共享iv. 遵循类的其它成员所遵循的所有访问限制C58 一个类最多可有几个虚析构函数i. 不定ii. 4iii. 3iv. 1D59 下列说法中正确的是i. 运算符new用于建立生存期可控的对象ii. new建立动态对象的语法完全不同于建立动态变量的情况iii. 使用new建立的动态对象不用时必须调用析构函数删除iv. new和构造函数不能同时使用A60 允许访问该类的所有对象的私有成员、公有成员和保护成员的是i. 友元函数ii. 成员函数iii. 内联函数iv. 重载函数A61 如果没有使用关键字,则所有成员A 都是public权限B 都是protected权限C 都是private权限D 权限情况不确定C62 联合以关键字_定义,成员缺省为_,并且在某个给定时间,只出现_个成员。Union公有一63 不带参数的构造函数又称为_。缺省构造函数64 建立指向类A的无参数、无返回值的成员函数的指针p的语句是_。void(A:*p)(void);65 在类定义中,在关键字protected之后说明的成员称_。保护成员66 在_部分定义的内容允许被其它对象无限制地存取。public67 指出下列程序段中的错误,并说明出错的原因。class testprivate: int num;public: test();test(int n);test:test()num=0;test:test(int n)num=n;void main()test x;test y(2,3);test arr2=2,3;没有定义两个参数的构造函数68 指出下面程序段中的错误,并改正。class Mprivate: int a;static int x;public: void f();static void sf(M&m);void M:f()x=15;void M:sf(M&m)a=10;应为:m.a=10;69 #include <iostream.h>class Mpublic: M(int i)X=i;cout<<X<<endl;M(M &m)X=m.X;cout<<X<<endl;void setX(int a)X=a;M()cout<<X<<endl;private: int X;void main()M m1(2),m2(m1);m2.setX(3);M m3=m2;输出为:22333257已知example是已定义的类,则在程序结束前,共存在几个对象#include “example,h”main()example x(5);example arr2=1,2;x=10;x.print();x=example(15);x.print();E. 3个 F. 5个 G. 7个 H. 8个B第四章习题及答案19 关于下面程序段,说法正确的是class Locationpublic: int GetX();class Rectangle: private Locationpublic: int GetW();I. 类Rectangle私有派生类LocationJ. 类Rectangle中的public成员在类Location中是私有的K. 类Location中的public成员在类Rectangle中是不可访问的L. void f()Rectangle r;int X=r.GetX();其中X=r.GetX();是非法语句D20 对于多重继承,有A 一个派生类只能有一个基类B 一个基类只能产生一个派生类C 一个基类必须产生多个派生类D 一个派生类可有多个基类D21 派生类的对象与基类的对象的关系是A 属于前者则不属于后者B 属于前者,不一定属于后者C 不属于前者则一定不属于后者D 属于前者则一定属于后者D22 对于以下程序段,表达式正确的是class basepublic: int b;class base1:public base;class base2:public base;class derived: public base1,public base2public: int fun();derived d;M. d.base1:b N. d.base:b O. d.b P. d.base:fun()A23 对于以下的程序段,没有二义性的表达式是class Apublic: int f( );class Bpublic: int g( ); int f( );class C:public A, public Bpublic: int g(); int h();C obj;A obj.f( )B obj.A:g()C obj.B:f()D obj.b:h()C24 构造函数(包括析构函数)是_继承的,所以,一个派生类只能调用它的_基类的构造函数。不能直接25 指出下面程序段中的错误,并说明出错原因。class Apublic: void fun();class Bprivate: void fun();class C: public A , private B ;C x;x.fun();两义性检查是在访问权限检查之前进行的,故成员的访问权限不能解决两义性问题26 在下面横线处填上适当字句,使程序完整。class baseint a;public: base(int i)a=I;class derived: public base int d;public: derived(int I,int j);_(int I, int j): base(i)d=j;void main()derived d(_);/将基类成员初始化为3,派生类成员初始化为5derived:derived3,527 单一继承形成一个_的树,多重继承形成一个_图。倒挂有向无环28 在下面横线处填上适当字句,使程序完整。#include <iostream.h>class Aprotected: int x,y;public: void setx(int a)x=a;void sety(int b)y=b;class B:public Aprivate: _;public: void seth(int c)h=c;void setw(int d)w=d;void show()cout<<x<<”,”<<y<<”,”<<h<<”,”<<w<<endl;void main()B r;_;/将对象r的地址置给指针pp->setx(3);p->sety(4);p->seth(5);p->setw(6);p->show();int h,wb* p=&r29 指出下面程序段中的错误,并改正。class base;class base1:public base;class base2:public base;class derived:public base1,public base2;base *bptr;derived *dptr;dptr=(derived *)bptr;可改为:dptr=(derived *)(base1 *)bptr;或dptr=(derived *)(base2 *)bptr;30 在下面横线处填上适当字句,使程序完整。#include <iostream.h>class Apublic: void f()cout<<”a.f”<<endl;class Bpublic: void g()cout<<”b.g”<<endl;void f()cout<<”b.f”<<endl;class C:_/类C从类A和类B公有派生void g()cout<<”c.g”<<endl;void main()C x;_;/对象x访问类B的g()x.A:f();public A, public Bx.B:g()31 下面程序用于计算各类形状的总面积。在下面横线处填上适当字句,完成程序功能。#include <iostream.h>class shapepublic: virtual float area=0;float total (_,int n)float sum=0;for(int i=0;i<n;i+)sum+=si->area();return sum;class triangle:public shapeprotected: float H,W;public: triangle(float h,float w)H=h;W=w;float area()return H*W*0.5;class rectangle:public trianglepublic: rectangle(float h,float w):triangle(h,w)float area()return H*W;void main()shape *s2;s0=new triangle(1.0,2.0);s1=new rectangle(2.0,4.0);float sum=total(s, _);