1、C+程序设计自考题-3 及答案解析(总分:100.00,做题时间:90 分钟)一、单项选择题(总题数:20,分数:20.00)1.用于包含 C+标准库 iostream的预处理指令是( )A#defineiostream B#includeiostreamC#defineiostream D#includeiostream(分数:1.00)A.B.C.D.2.设有定义 int i;double j=5;,则 10+i+j值的数据类型是( )Aint BdoubleCfloat D不确定(分数:1.00)A.B.C.D.3.对 class Base,如使用 Base*pt=new Base2;创
2、建对象数组,则删除此数组使用的语句是( )Adelete pt2; Bdelete pt;Cdelete pt; Ddelete2pt;(分数:1.00)A.B.C.D.4.函数调用 func(exp1,exp2),(exp3,exp4,exp5)中所含实参的个数为( )A1 B2C4 D5(分数:1.00)A.B.C.D.5.下列选项中属于 C+语句的是( )A; Ba=17Ci+5 Dcout/n(分数:1.00)A.B.C.D.6.在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是( )A友元函数 B虚函数C构造函数 D析构函数(分数:1.00)
3、A.B.C.D.7.C+中是否允许在类结构中定义函数( )A不允许 B允许C仅允许定义构造函数 D只不允许定义构造函数(分数:1.00)A.B.C.D.8.假定 AB为一个类,则执行“AB a(2),b3,*p4;“语句时调用该类构造函数的次数为( )A3 B4C5 D9(分数:1.00)A.B.C.D.9.假定 AB为一个类,px 为指向该类的一个含有 n个对象的动态数组的指针,则执行“delete px;“语句时调用该类析构函数的次数为( )A0 B1Cn Dn+1(分数:1.00)A.B.C.D.10.假定一个类的构造函数为“A(int i,int j)x=i;y=i*j;“,则执行“A
4、 a(4,5);“语句后,a.x 和 a.y的值分别为( )A4 和 5 B5 和 4C4 和 20 D20 和 5(分数:1.00)A.B.C.D.11.已知 f和 g是同一类中的两个成员函数,若 f的实现代码体内不能调用 g,则可能的情况是( )Af 和 g都是常成员函数 Bf 是常成员函数,g 不是Cf 不是常成员函数,g 是常成员函数 Dg 和 f都不是常成员函数(分数:1.00)A.B.C.D.12.静态成员函数没有( )A返回值 Bthis 指针C指针参数 D返回类型(分数:1.00)A.B.C.D.13.要禁止修改指针 p本身,又要禁止修改 p所指向的数据,这样的指针应定义为(
5、)Aconst char*p=“ABCD”; Bchar*const p=“ABCD”;Cchar const*p=“ABCD”; Dconst char*const p=“ABCD”;(分数:1.00)A.B.C.D.14.类 A中存在静态数据成员 x,设 a和 b是类 A的两个对象,在执行 a.x=10之后,b.x 的值为( )A未初始化 B等于 a.xC等于 0 D随机(分数:1.00)A.B.C.D.15.当一个类的某个函数被说明为 virtual时,该函数在该类的所有派生类中( )A都是虚函数 B可能是虚函数C只有被重新说明为 virtual时才是虚函数 D都不是虚函数(分数:1.0
6、0)A.B.C.D.16.如果表达式+a 中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为( )Aa.operator+(1) Boperator+(a)Coperator+(a,1) Da.operator+()(分数:1.00)A.B.C.D.17.对于友元描述正确的是( )A友元是本类的成员函数 B友元不是本类的成员函数C友元不是函数 D友元不能访问本类的私有成员(分数:1.00)A.B.C.D.18.在 main函数中可以用 p.a的形式访问派生类对象 p的基类成员 a,其中 a是( )A私有继承的公有成员 B公有继承的私有成员C公有继承的保护成员 D公有继承
7、的公有成员(分数:1.00)A.B.C.D.19.对类 A,复制构造函数的原型是( )AA:A(const A&); BA:A(const A*);CA:A(const A); DA:A();(分数:1.00)A.B.C.D.20.声明友元使用的关键字为( )Aconst BstaticCclass Dfriend(分数:1.00)A.B.C.D.二、填空题(总题数:20,分数:20.00)21.假设 int a=1,b=2;,则表达式(+a/b)*b-的值为 1。(分数:1.00)填空项 1:_22.每个对象都是所属类的一个 1。(分数:1.00)填空项 1:_23.执行下列程序double
8、 a=3.1415926,b=3.14;coutsetprecision(5)a“,“setpreeision(5)bendl;程序的输出结果是_。(分数:1.00)填空项 1:_24.在程序中执行 int*a=new int之后,若 a为空指针,则表明 1。(分数:1.00)填空项 1:_25.若要使用 string类,需要引入的头文件是 1。(分数:1.00)填空项 1:_26.在 C+中,编译指令都是以 1(符号)开始。(分数:1.00)填空项 1:_27.假定用户为类 A定义了一个构造函数“A(int i=0):x(i)“,则与该语句等价的定义构造函数的格式为 1。(分数:1.00)填
9、空项 1:_28.为了在对象生存期结束时释放其指针成员所指向的动态存储空间,通常为该类定义 1。(分数:1.00)填空项 1:_29.复制构造函数使用 1 作为形式参数。(分数:1.00)填空项 1:_30.在已经定义了整型指针 ip后,为了得到一个包括 10个整数的数组并由 ip所指向,应使用语句 1。(分数:1.00)填空项 1:_31.C+函数分为库函数(标准函数)和 1 两类。(分数:1.00)填空项 1:_32.设类 A有成员函数 void f(void);,若要定义一个指向类成员函数的指针变量 pf来指向 f,该指针变量的声明语句是 1。(分数:1.00)填空项 1:_33.在单一
10、继承和多重继承方式中,面向对象程序设计应尽量使用 1 继承。(分数:1.00)填空项 1:_34.继承的方式有公有继承、私有继承和 1。(分数:1.00)填空项 1:_35.C+函数的返回值类型可以是除 1 与函数以外的任何类型。(分数:1.00)填空项 1:_36.vector类中用于删除向量中的所有对象的方法是 1。(分数:1.00)填空项 1:_37.一个抽象类的派生类可以实例化的必要条件是实现了所有的 1。(分数:1.00)填空项 1:_38.在 C+中,虚函数帮助实现了类的 1。(分数:1.00)填空项 1:_39.如果在派生类中要访问被重定义了的基类同名函数,那么需使用 1 才可调
11、用。(分数:1.00)填空项 1:_40.如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生 1 静态变量。(分数:1.00)填空项 1:_三、改错题(总题数:5,分数:20.00)41.#includeiostream.hclass Apublic:A(int i=8):y(i)static int x:int y;int x=20;/对类成员初始化void main()A a;couta.x“,“a.yendl;(分数:4.00)_42.#includeiostreamhclass Aint a,b;const int c;public:A():c(0),a(0),b(0)A(i
12、nt aa,int bb):c(aa+bb)a=aa;b=bb;void show()cout“const c:“cendl;cout“a,b:“abendl;void main()A a,b(1,2);A*x=&a;x.show();b.show();(分数:4.00)_43.运行程序,从键盘上输入“This is a C+prog!”后输出到一个文件中,并显示在屏幕上,显示结果:This is a C+prog!。#includeiostream#includefstream#includestringusing namespace std;void main()char str20;of
13、stream outf(“D:/tem.dat“,ios:trunc);cinstr;outfstr;outf.close();int i=0;while(stri!=/0)coutstri;i+;coutendl;(分数:4.00)_44.#includeiostream#includefstream#includestringusing namespace std;class Apublic:A(const char*na)strcpy(name,na);private:char name80;class B:public Apublic:B(const char*nm):A(nm)voi
14、d show();void B:show()cout“name:“nameendl;void main()B b1(“B“);b1.show();(分数:4.00)_45.#includeiostream.hclass Aprivate:int x;public:A(int i)x=i;A()x=0;friend int min(A&,A&);:int min(A&a,A&b)return(a.xb.x)? a.x:b.x;void main()A a(3),b(5);couta.min(a,b)endl;(分数:4.00)_四、完成程序题(总题数:5,分数:20.00)46.完成下面类中成员
15、函数的定义。#includeiostream.hclass vehicleprotected:int size;int speed;public:void set(int s)speed=s;_get()return speed/10;class car:public vehiclepublic:int get()return speed;class truck:public vehiclepublic:int get()return speed/2;int max(_)if(v1.get()v2.get()return 1;elsereturn 2;void main()truck t;ca
16、r c;t.set(160);c.set(80);coutmax(t,c)endl;/此结果输出为 2(分数:4.00)_47.在下划线处填上缺少的部分。#includeiostream.hclass Aint a,b;public:_/定义构造函数,使参数 i和 j的默认值为 0a=i;b=j;/在函数体中用 i初始化 a,用 j初始化 b;main()A*p;_;/调用带参构造函数生成由 p指向的动态对象/使 a和 b成员分别被初始化为 4和 5(分数:4.00)_48.先为数组 a输满数据,再为 x输入一个数据,在数组 a中找出第一个与 x相等的元素并将其下标输出,若不存在这样的元素,则
17、输出“Not found!“标志。#includeiostream.hvoid main()int i,x,a10,m;cout“输入数组中的 10个数据:“;for(i=0;i10;i+)cinai;coutendl“输入要查找的一个数据:“;cinx;coutxendl;for(i=0;i10;i+)if(_)m=i;break;if(_)coutx“在数组中的位置是:“mendl;elsecout“Not found!/n“endl;(分数:4.00)_49.完成下面类中成员函数的定义。#includeiostream#includestringusing namespace std;c
18、lass strprivate:char*st;public:str(char*a)set(a);str&operator=(_)delete st;set(a.st);return*this;void show()coutstendl;str()delete st;void set(char*s)/初始化 st_strcpy(st,s);void main()str s1(“he“),s2(“she“);s1.show(),s2.show();s2=s1;s1.show(),s2.show();(分数:4.00)_50.下面程序段用来求三角形的面积,首先进行判断,三边不符合组成三角形时,返回
19、-1;符合时输出三角形面积。#includeiostream.h#includemath.hdouble area(double a,double b,double c)if(_)return -1;elsedouble ar,1;1=(a+b+c)/2;ar=sqrt(1*(1-a)*(1-b)*(1-c);return ar;void main()double i=0,j=0,k=0;cout“输入三角形三边:“;cinijk;double s=area(i,j,k);if(s0)cout“不是三角形“endl;else_(分数:4.00)_五、程序分析题(总题数:2,分数:10.00)5
20、1.给出下面程序的输出结果。#includeiostream.htemplateclass Tclass ComplexT real,image;public:Complex(T a,T b):real(a)image=b;Complex(T a)image=0,real=a;void pr()char c;c=(image0? +:-);if(image!=0)coutrealc(image0? image:-image)“i“endl;elsecoutrealendl:;void main()Complexdoublea(16.5,-7.8);a.pr();Complexintb(6);b
21、.pr();(分数:5.00)_52.给出下面程序的输出结果。#includeiostream.hclass exampleint a;public:example(int b=5)a=b+;void print()a=a+1;couta“ “;void print()constcoutaendl;void main()example x;const exahaple y(2);x.print();y.print();(分数:5.00)_六、程序设计题(总题数:1,分数:10.00)53.已有复数类 Complex和主函数 main(),编写一个类 Root来实现求解一元二次方程的程序。#in
22、cludeiostream.h#includeiomanip.h#includemath.hclass Complexpublic:Complex()void setC(double i,double j)real=i;image=j;void show();protected:double real,image;void Complex:show()cout“(“real“,“image“i)“endl;void main()double a,b,c;cout“/n 请输入一元二次方程的系数 a,b,c:“;cinabc;Root root(a,b,c);root.solve();(分数:1
23、0.00)_C+程序设计自考题-3 答案解析(总分:100.00,做题时间:90 分钟)一、单项选择题(总题数:20,分数:20.00)1.用于包含 C+标准库 iostream的预处理指令是( )A#defineiostream B#includeiostreamC#defineiostream D#includeiostream(分数:1.00)A.B. C.D.解析:解析 主要考查的知识点为预处理指令。要点透析 在 C+程序语句中预处理语句都以位于行首的符号“#”开始。预处理语句有 3种,分别是宏定义、文件包含和条件编译,其中文件包括语句书写时,可以使用引号也可以使用尖括号。2.设有定义
24、 int i;double j=5;,则 10+i+j值的数据类型是( )Aint BdoubleCfloat D不确定(分数:1.00)A.B. C.D.解析:解析 本题主要考查的知识点为算术表达式的运算类型。要点透析 对于算术表达式,当参加运算的两个运算分量中至少有一个是双精度型时,则运算结果为双精度型。j 是 double类型,故运算结果是 double类型。3.对 class Base,如使用 Base*pt=new Base2;创建对象数组,则删除此数组使用的语句是( )Adelete pt2; Bdelete pt;Cdelete pt; Ddelete2pt;(分数:1.00)A
25、.B.C. D.解析:解析 主要考查的知识点为使用 delete释放动态内存空间。要点透析 使用 delete对动态分配的数组进行释放的语法格式为:delete指针。4.函数调用 func(exp1,exp2),(exp3,exp4,exp5)中所含实参的个数为( )A1 B2C4 D5(分数:1.00)A.B. C.D.解析:解析 本题主要考查的知识点为表达式的值作为函数参数。要点透析 (exp1,exp2)、(exp3,exp4,exp5)表示是两个逗号表达式,相当于两个参数,因此实参的个数是 2。5.下列选项中属于 C+语句的是( )A; Ba=17Ci+5 Dcout/n(分数:1.0
26、0)A. B.C.D.解析:解析 本题主要考查的知识点为 C+语句。要点透析 C+中,语句以“;“结束,A 项为空语句,本题选 A。6.在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是( )A友元函数 B虚函数C构造函数 D析构函数(分数:1.00)A.B.C. D.解析:解析 本题主要考查的知识点为类的构造函数的作用。要点透析 定义构造函数作用就是初始化对象,而析构函数的作用是释放对象空间。虚函数用于完成多态性,友元增加访问方便性。7.C+中是否允许在类结构中定义函数( )A不允许 B允许C仅允许定义构造函数 D只不允许定义构造函数(分数:1.00
27、)A.B. C.D.解析:8.假定 AB为一个类,则执行“AB a(2),b3,*p4;“语句时调用该类构造函数的次数为( )A3 B4C5 D9(分数:1.00)A.B. C.D.解析:解析 本题主要考查的知识点为类对象的创建和构造函数的调用。要点透析 a(2)调用 1次带参数的构造函数,b3调用 3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数,所以共调用构造函数的次数为 4。9.假定 AB为一个类,px 为指向该类的一个含有 n个对象的动态数组的指针,则执行“delete px;“语句时调用该类析构函数的次数为( )A0 B1Cn Dn+1(分数:1.00)A.B.C. D.
28、解析:解析 本题主要考查的知识点为析构函数和运算符 delete。要点透析 当使用运算符 delete删除一个动态对象时,它首先为这个动态对象调用析构函数,然后再释放这个动态对象占用的内存。该类使用 new动态创建了 n对象,必须使用 delete释放产生的对象,每个对象都要释放内存空间,所以调用 n次。10.假定一个类的构造函数为“A(int i,int j)x=i;y=i*j;“,则执行“A a(4,5);“语句后,a.x 和 a.y的值分别为( )A4 和 5 B5 和 4C4 和 20 D20 和 5(分数:1.00)A.B.C. D.解析:11.已知 f和 g是同一类中的两个成员函数
29、,若 f的实现代码体内不能调用 g,则可能的情况是( )Af 和 g都是常成员函数 Bf 是常成员函数,g 不是Cf 不是常成员函数,g 是常成员函数 Dg 和 f都不是常成员函数(分数:1.00)A.B. C.D.解析:12.静态成员函数没有( )A返回值 Bthis 指针C指针参数 D返回类型(分数:1.00)A.B. C.D.解析:解析 本题主要考查的知识点为静态成员函数。要点透析 静态成员函数没有 this指针,静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员,故本题选 B。13.要禁止修改指针 p本身,又要禁止修改 p所指向的数据,这样的指针应定义为( )Acon
30、st char*p=“ABCD”; Bchar*const p=“ABCD”;Cchar const*p=“ABCD”; Dconst char*const p=“ABCD”;(分数:1.00)A.B.C.D. 解析:解析 本题主要考查的知识点为 const对象。要点透析 const char*p 说明禁止通过 p修改所指向的数据。char*cons p 则说明不能修改指针 p的地址。因此 const char*const p=“ABCD“;表示既禁止修改指针 p本身,又禁止修改 p所指向的数据。14.类 A中存在静态数据成员 x,设 a和 b是类 A的两个对象,在执行 a.x=10之后,b.
31、x 的值为( )A未初始化 B等于 a.xC等于 0 D随机(分数:1.00)A.B. C.D.解析:解析 主要考查的知识点为静态数据成员。要点透析 静态数据成员被类的所有对象所共享,它不属于任何一个对象,其作用域是类范围。15.当一个类的某个函数被说明为 virtual时,该函数在该类的所有派生类中( )A都是虚函数 B可能是虚函数C只有被重新说明为 virtual时才是虚函数 D都不是虚函数(分数:1.00)A. B.C.D.解析:解析 本题主要考查的知识点为虚函数。要点透析 在基类声明为 virtual的函数为虚函数,在派生类中只要有相同的函数(函数名相同、返回值相同、形参类型和个数相同
32、),即使不用 virtual说明,也都是虚函数。16.如果表达式+a 中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为( )Aa.operator+(1) Boperator+(a)Coperator+(a,1) Da.operator+()(分数:1.00)A.B.C.D. 解析:17.对于友元描述正确的是( )A友元是本类的成员函数 B友元不是本类的成员函数C友元不是函数 D友元不能访问本类的私有成员(分数:1.00)A.B. C.D.解析:解析 主要考查的知识点为友元。要点透析 友元不是该类的成员,只是提供了访问该类的一种捷径或方法,A 项错误;友元可以是函数,
33、也可以是类,C 项错误;友元可以访问该类的所有成员,D 项错误。18.在 main函数中可以用 p.a的形式访问派生类对象 p的基类成员 a,其中 a是( )A私有继承的公有成员 B公有继承的私有成员C公有继承的保护成员 D公有继承的公有成员(分数:1.00)A.B.C.D. 解析:解析 本题主要考查的知识点为派生类中基类成员的访问权限。要点透析 公有成员可以在类外访问,保护成员可以在派生类中访问,但不能在类外访问,在 main函数中访问,说明 a是公有成员。只有公有继承时 a才能是公有的,所以 D项正确。19.对类 A,复制构造函数的原型是( )AA:A(const A&); BA:A(co
34、nst A*);CA:A(const A); DA:A();(分数:1.00)A. B.C.D.解析:解析 主要考查的知识点为复制构造函数。要点透析 对类 A而言,复制构造函数的原型为 A:A(A&),为了不改变原有对象,更普通的形式是使用 const限定,即 A:A(const A&)。20.声明友元使用的关键字为( )Aconst BstaticCclass Dfriend(分数:1.00)A.B.C.D. 解析:二、填空题(总题数:20,分数:20.00)21.假设 int a=1,b=2;,则表达式(+a/b)*b-的值为 1。(分数:1.00)填空项 1:_ (正确答案:2)解析:2
35、2.每个对象都是所属类的一个 1。(分数:1.00)填空项 1:_ (正确答案:实例)解析:23.执行下列程序double a=3.1415926,b=3.14;coutsetprecision(5)a“,“setpreeision(5)bendl;程序的输出结果是_。(分数:1.00)填空项 1:_ (正确答案:3.1416,3.14)解析:24.在程序中执行 int*a=new int之后,若 a为空指针,则表明 1。(分数:1.00)填空项 1:_ (正确答案:内存分配失败)解析:25.若要使用 string类,需要引入的头文件是 1。(分数:1.00)填空项 1:_ (正确答案:str
36、ing.h)解析:26.在 C+中,编译指令都是以 1(符号)开始。(分数:1.00)填空项 1:_ (正确答案:#)解析:27.假定用户为类 A定义了一个构造函数“A(int i=0):x(i)“,则与该语句等价的定义构造函数的格式为 1。(分数:1.00)填空项 1:_ (正确答案:A(int i=0)x=i;)解析:28.为了在对象生存期结束时释放其指针成员所指向的动态存储空间,通常为该类定义 1。(分数:1.00)填空项 1:_ (正确答案:析构函数)解析:29.复制构造函数使用 1 作为形式参数。(分数:1.00)填空项 1:_ (正确答案:对象的引用)解析:30.在已经定义了整型指
37、针 ip后,为了得到一个包括 10个整数的数组并由 ip所指向,应使用语句 1。(分数:1.00)填空项 1:_ (正确答案:ip=new int10;)解析:31.C+函数分为库函数(标准函数)和 1 两类。(分数:1.00)填空项 1:_ (正确答案:自定义函数)解析:32.设类 A有成员函数 void f(void);,若要定义一个指向类成员函数的指针变量 pf来指向 f,该指针变量的声明语句是 1。(分数:1.00)填空项 1:_ (正确答案:void(A:*pf)(void)=&A:f;)解析:33.在单一继承和多重继承方式中,面向对象程序设计应尽量使用 1 继承。(分数:1.00)
38、填空项 1:_ (正确答案:单一)解析:34.继承的方式有公有继承、私有继承和 1。(分数:1.00)填空项 1:_ (正确答案:保护继承)解析:35.C+函数的返回值类型可以是除 1 与函数以外的任何类型。(分数:1.00)填空项 1:_ (正确答案:数组)解析:36.vector类中用于删除向量中的所有对象的方法是 1。(分数:1.00)填空项 1:_ (正确答案:clear-|_|-)解析:37.一个抽象类的派生类可以实例化的必要条件是实现了所有的 1。(分数:1.00)填空项 1:_ (正确答案:纯虚函数的定义)解析:38.在 C+中,虚函数帮助实现了类的 1。(分数:1.00)填空项
39、 1:_ (正确答案:多态性)解析:39.如果在派生类中要访问被重定义了的基类同名函数,那么需使用 1 才可调用。(分数:1.00)填空项 1:_ (正确答案:基类名加作用域运算符(:))解析:40.如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生 1 静态变量。(分数:1.00)填空项 1:_ (正确答案:一个或多个)解析:三、改错题(总题数:5,分数:20.00)41.#includeiostream.hclass Apublic:A(int i=8):y(i)static int x:int y;int x=20;/对类成员初始化void main()A a;couta.x“
40、,“a.yendl;(分数:4.00)_正确答案:(int x;静态数据成员初始化,需要在类外进行,格式错误。应改为 int A:x=20;。)解析:42.#includeiostreamhclass Aint a,b;const int c;public:A():c(0),a(0),b(0)A(int aa,int bb):c(aa+bb)a=aa;b=bb;void show()cout“const c:“cendl;cout“a,b:“abendl;void main()A a,b(1,2);A*x=&a;x.show();b.show();(分数:4.00)_正确答案:(x.show();错误,x 是指针引用成员有两种方法:一是利用指向运算符“-“,二是使用成员运算符“。应改为 x-show();或者(*x).show();)解析:43.运行程序,从键盘上输入“This is a C+prog!”后输出到一个文件中,并显示在屏幕上,显示结果:This is a C+prog!。#includeiostream#includefstream#includestringusing namespace std;void main()char str20;ofstream outf(“D:/