首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

c++期末考试复习题 2

2023-03-23 来源:华拓网


一、 填空题

1.C++中有两种数据类型: ( 整型 )和 ( 字符型 )可以使用signed修饰符。 在C++中,用数组、指针、和( 引用 )作为函数参数,能够将参数值带回。

2.为了降低函数调用的时间开销,建议将小的调用频繁的函数定义为(内联函数 ),方法是在函数类型前加上( inline )关键字。

3.面向对象的程序设计有四大特征,它们是抽象、封装、( 继承 )、( 多态 )。

4.拷贝构造函数是在用一个对象初始化另一个对象时被调用,系统缺省的拷贝构造函数的工作方法是( 拷贝每一个数据成员 )。或逐一拷贝

5.用new申请某一个类的动态对象数组时,在该类中必须能够匹配到( 默认 )构造函数,否则应用程序会产生一个编译错误。

6.静态数据成员必须在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象( 共享 )。 7.在C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型( 有一个不同 )。

8.在C++中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的( 封装 )特性。 9.预编译指令由三种,它们是:文件包含、 ( 宏定义)(条件编译) 11.在C++中,函数的参数有两种传递方式,它们是值传递和( 引用传递 )。 12.当非静态成员函数被调用时,该成员函数的( this指针 )指向调用它的对象。 13.拷贝构造函数使用( 一个已经存在的对象 )作为参数初始化创建中的对象。 14.在公有继承的情况下,基类数据成员在派生类中的访问权限( 保持不变 )。 15.在C++中,构造派生类对象时,总是先从( 基类 )的初始化开始的。 16.当需要统计程序中某个类创建对象的个数时,需要给该类定义( 静态数据 )成员。

17.在多个类之间有重复继承时,为避免被重复继承的基类数据成员在内存中有多个拷贝,应将该基类定义为( 虚基类 )。

18.在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为( 抽象类 ),定义该类至少具有一个( 纯虚函数 )。 19.在C++中构造一个对象时,其数据成员在构造函数中初始化。对于内嵌的对象、 ( 常量) ( 基类)数据成员需要在构造函数的成员初始化列表中初始化。

20.在类的定义中,说明为protected的数据成员称为保护成员。保护数据成员具有双重作用:对于其派生类而言, (是公有的);而对于其外部的程序而言, ( 是私有的 )。

22.如果s是int型变量,且s=6,则下面s%2+(s+1)%2表达式的值为___1 _。

23.已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=‟a‟+4‟的值为__ e__。 传递,对形参的改变可影响到实参。

25.利用“对象名.成员变量”形式访问的对象成员仅限于被声明为 public 的成员;若要访问其他成员变量,需要通过 成员 函数或友元函数函数。

26.一个__类__和_对象__的关系,正如基本数据类型与该类型的变量一个。 27.类成员的默认访问方式是__私有_ __.

28.一个类有_多个_个构造函数,有___一个__析构函数。

29.类的__静态__成员函数不能对类中的非静态成员进行默认访问。

30.如果说明类B是类A的友元类,则类B的所有成员函数都是类A的__友元函数____。

32.类有两种用法:一种是类的实例化,即生成类的_对象_____ ;另一种是通过__继承_____派生出新的类。 34.如果一个类中有一个或多个纯虚函数,则这个类称为__抽象类____。 36.设所有变量均为整型,则表达式(e=2,f=5,e++,f++,e+f)的值为_9_。

24.数组与函数参数联系密切,当用数组元素作函数参数时,这是属于值传递;当数组名作为参数时,这是属于 引用

37.已知c的ASCII码为十进制数99,设k为字符型变量,则表达式k=„c‟+1的值为___d_____。 38.函数的形参在未被调用之前 不会 分配空间,函数的形参的 个数和类型 要和实参的相同。 39.类的成员分为数据成员和_成员函数______。 40.类完成了面向对象程序设计的__封装___特性。

41.构造函数是__对象____被创建时自动执行,对象消失时自动执行的成员函数称为__析构函数_____对象 42.C++将类继承分为 单继承 和 多继承 两种。

43.在继承机制下,当对象消亡时,编译系统先执行 派生类 的析构函数,然后才执行派生类中子对象类的析构函数,最后执行 基类 的析构函数。

44.类的__public__数据成员是类所有对象共享的成员。 45.友元函数__不是_类的成员函数。(是/不是)

46.如果类A继承了类B,则类A称为___派生类____,类B称为____基类___。

48.___纯虚函数___是一个在基类中说明的虚函数,但未给出具体的实现,要求在其派生类实现。 二、选择题

1.面向对象的( B )是一种信息隐蔽技术,目的在于将对象的使用者与设计者分开。不允许使用者直接存取对象的属性,只能通过有限的接口与对象发生联系。

A.多态性 B.封装性 C.继承性 D.重用性 2.C++的合法注释是( B )。

A./*This is a C program/* B.// This is a C program C. “This is a C program” D./*This is a C program// 3.关于C++和C语言的描述中,( D )是错误的?

A.C是C++的一个子集 B. C程序在C++环境可以运行 C. C++程序在C环境可以运行 D. C++是面向对象的而C是面向过程的 4.运算符 +、<=、=、% 中,优先级最低的运算符是( C )。 A. + B.<= C.= D.%

5.已知a=4,b=6,c=8,d=9,则“(a++,b>a++&&c>d)?++d:aB.do…while结构中的语句至少执行一次(先执行后判断)

C.while结构中的语句至少执行一次 D.条件成立时,它们有可能一次也不执行 7.对中断语句的说法下面不正确的是( B )。

A.用户可以指定中断的位置 B.用户可以指定转移的位置 C.break语句可以跳出本循环 D.continue语句可以结束本次循环 8.以下正确的说法是( )。

A.用户若需要调用标准函数,调用前必须重新定义 B.用户可以直接调用所有标准库函数

C.用户可以定义和标准库函数重名的函数,但是在使用时调用的是系统库函数 D.用户可以通过文件包含命令将系统库函数包含到用户源文件中,然后调用系统库函数 9.下列哪个不是重载函数在调用时选择的依据( )。

A.参数类型 B.参数个数 C.函数类型 D.函数名 10.对数组名作函数的参数,下面描述正确的是(B)。

A.数组名作函数的参数,调用时将实参数组复制给形参数组 B.数组名作函数的参数,主调函数和被调函数共用一段存储单元 C.数组名作参数时,形参定义的数组长度不能省略 D.数组名作参数,不能改变主调函数中的数据 11.如果x是整型变量,则合法的形式是( D )。 A.&(x+5)

B.*x

C.&*x

D.*&x

12.在定义一个共用体变量时,系统为其分配存储空间的原则是( B)。 A.按所有成员需要的存储空间总和分配。B.按成员中占存储空间最大者分配。 C.按成员占存储空间最小者分配。 D.按第一个成员所需的存储空间分配。 13.下面( B )项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X()

B.X::X(参数), X::~X() (析构括号没参数) C.X::X(参数), X::~X(参数) D.void X::X(参数), void X::~X(参数)

14.拷贝构造函数具有的下列特点中,( D )是错误的。

A. 如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的 B. 拷贝构造函数只有一个参数,并且是该类对象的引用 C. 拷贝构造函数是一种成员函数 D. 拷贝构造函数的名字不能用类名 15.类的析构函数的作用是( D )。

A.一般成员函数 B.类的初始化 C.对象初始化 D.删除对象 16.下列对派生类的描述中,( D )是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类

C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变

17.继承具有( B ),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。 A规律性 B.传递性 C.重复性 D.多样性 18.C++类体系中,能被派生类继承的是( B )。

A.构造函数 B.虚函数 C.析构函数 D.友元函数 19.下列关于动态联编的描述中,错误的是(D)。 A.动态联编是以虚函数为基础

B.动态联编是运行时确定所调用的函数代码的 C.动态联编调用函数操作是指向对象的指针或对象引用

D.动态联编是在编译时确定操作函数的(如果已经确定还谈什么动态) 20.关于纯虚函数和抽象类的描述中,错误的是( C )。 A.纯虚函数是一种特殊的虚函数,它没有具体的实现 B.抽象类是指具有纯虚函数的类

C.一个基类中说明有纯虚函数,该基类派生类一定不再是抽象类(如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类) D. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 21.C++源文件的扩展名为( A )。

A.cpp B.c C.txt D.exe 22.在C++语言中,( A )的陈述是正确的。

A.能使用关键字并区分大小写 B.能使用关键字并不区分大小写 C. 不能使用关键字并区分大小写 D.不能使用关键字并不区分大小写 23.运算符+、=、*、>=中,优先级最高的运算符是( C)。

A.+ B.= C.* D.>= 24.下列不合法的变量名为( A )。

A.int B.int1 C.name_1 D.name0

25.已知x=43,ch=„A‟,y=0;则表达式(x>=y&&ch<‟B‟&&!y)的值是( C)。

A.0 B.语法错 C.1 (!y=!0=1只有!0为1,其他都为0) 26.以下不正确的是( C )。

A.语句for(i=0;;i++)表示无限循环 B.for(;;)表示无限循环

C.for()也表示无限循环 (B才对) D.while(1)表示无限循环27.在函数的返回值类型与返回值表达式的类型的描述中,错误的是( )。

A.函数返回值的类型是在定义函数时确定,在函数调用时是不能改变的 B.函数返回值的类型就是返回值表达式的类型(看ACD)

C.函数返回值表达式类型与返回值类型不同时,函数表达式类型应转换成返回值类型 D.函数返回值类型决定了返回值表达式的类型

28.如果一个函数无返回值,定义时它的函数类型应是(C)。

A.任意 B.int C.void D.无 29.在C++语言中,关于参数默认值的描述正确的是(B)。

A.只能在函数定义时设置参数默认值

B.设置参数默认值时,应当从右向左设置(如int a,b,c=1,d=33) C.设置参数默认值时,应当全部设置

D.设置参数默认值后,调用函数不能再对参数赋值 30.若有以下定义,则说法错误的是( D )。

int a=100,*p=&a ;

A.声明变量p,其中*表示p是一个指针变量 B.变量p经初始化,获得变量a的地址 C.变量p只可以指向一个整形变量 D.变量p的值为100 (获得变量a的地址) 31.列关于结构体的说法错误的是( D)。

A.结构体是由用户自定义的一种数据类型 B.结构体中可设定若干个不同数据类型的成员

C.结构体中成员的数据类型可以是另一个已定义的结构体 D.在定义结构体时,可以为成员设置默认值 32.下列有关类的说法不正确的是( C )。

A. 对象是类的一个实例

B. 任何一个对象只能属于一个具体的类 C. 一个类只能有一个对象

D. 类与对象的关系和数据类型与变量的关系相似 33.( C )的功能是对象进行初始化。

D.“假”

A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数 34.关于友元的描述中,( A )是错误的。

A. 友元函数是成员函数 (不能),它被说明在类体内 B. 友元函数可直接访问类中的私有成员 C. 友元函数破坏封装性,使用时尽量少用 D. 友元类中的所有成员函数都是友元函数

35.了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为( A )。

A.public B. protected C.private D. static 36.派生类的对象对它的( A )是可以访问的。

A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 37.多继承派生类构造函数构造对象时,( B)被最先调用。

A.派生类自己的构造函数 B.虚基类的构造函数

C.非虚基类的构造函数 D.派生类中子对象类的构造函数 38.C++类体系中,不能被派生类继承的有( A )。

A.构造函数 (构造函数和析构函数都不可被派生类继承) B.虚函数 C.静态成员函数39.编译时的多态性可以通过使用( C )获得。

A.虚函数和指针 B.重载函数和析构函数 C.虚函数和对象 D.虚函数和引用 40.下列描述中,( D )是抽象类的特征。

A.可以说明虚函数 B.可以进行构造函数重载 C.可以定义友元函数 D.不能说明其对象 41、下列变量名中,( )是合法的。

A. CHINA B .byte-size C .double D .A+a

42 、为了避免嵌套的if-else语句的二义性,C语言规定else总是与( )组成配对关系。

A.缩排位置相同的if B.在其之前未配对的if C.在其之前未配对的最近的if D.同一行上的if

43、循环语句whlie(int i=0 )i--;的循环次数是( )。 A. 0 B. 1 C. 5 D. 无限

44、下列给字符数组进行的初始化中,不正确的是( )。 A. char s1[]=\"abcd\"; B. char s2[3]={'x','y','\\0'}; C. char s3[]={'a','x','y','\\0'}; D. char s4[6]={\"xyz\

45、设\"char **s;\",以下正确的表达式是( )。

A. s=\"computer\"; B. *s=\"computer\"; C. **s=\"computer\"; D. *s='c';

46.( )不是构造函数的特征。

D.赋值操作函数

A.构造函数的函数名与类名相同 B.构造函数可以重载 C.构造函数可以设置缺省参数 D.构造函数必须指定类型说明

47、关于友元函数的描述中,错误的是( )。 A. 友元函数不是成员函数 B. 友元函数只能访问类中私有成员 C. 友元函数破坏隐藏性,尽量少用

D. 友元函数说明在类体内,使用关键字friend 48、下面四个选项中,( )是用来声明虚函数的。 A. virtual B. public C. include D. using namespace 49、使用派生类的主要原因是( )。

A. 提高代码的可重用性 B. 提高程序的运行效率 C. 加强类的封装性 D. 实现数据的隐藏 50、关于常成员的描述中,错误的是( )。 A. 常成员包含常数据成员和常成员函数两种 B. 常数据成员必须是公有的

C. 常数据成员要使用构造函数成员初始化列表进行初始化 D. 常对象只能调用它的常成员函数,不能调用其它的成员函数

51.C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,从面向过程变成了面向对象。 A. 增加了一些新的运算符 B. 允许函数重载,并允许设置缺省参数 C. 规定函数说明必须用原型 D. 引进了类和对象的概念 52派生类的对象可以访问基类成员中的( )。 A. 公有继承的保护成员 B. 保护继承的公有成员 C. 公有继承的公有成员 D. 保护继承的保护成员 53、下列关于C++函数的叙述中,正确的是( )。

A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值 C)函数在被调用之前必须先声明 D)函数不能自己调用自己 54、下列关于类和对象的叙述中,错误的是( )。

A)一个类只能有一个对象 B)对象是类的具体实例

C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系 55、在C++中,用于实现运行时多态性的是( )。

A)内联函数 B)重载函数 C)模板函数 D)虚函数 57、对于语句 cout<A)“cout”是一个输出流对象 B)“endl”的作用是输出回车换行 C)“x”是一个变量 D)“<<”称作提取运算符

58、有如下类声明,则类MyDERIVED中保护的数据成员和成员函数的个数是( )。 class MyBASE { private: int k;

public: void set(int n){ k=n;}

int get( )const{ return k;} }; class MyDERIVED: protected MyBASE

{ protected: int j;

public: void set(int m, int n){ MyBASE::set(m); j=n;} int get( ) const { return MyBASE::get( )+j; } }; A)4 B)3 C)2 D)1

61、在下列函数原型中,可以作为类AA构造函数的是( )。 A)void AA(int); B)int AA(); C)AA(int)const; D)AA(int); 62、下面四个选项中,( )是用来声明虚函数的。 A)virtual B)public C)include D)using namespace 63、实现运行时的多态性要使用( )。

A)重载函数 B)构造函数 C)析构函数 D)虚函数 64、要实现动态联编,必须通过( )调用虚函数。

A)对象指针 B)成员名限定 C)对象名 D)派生类名 65、以下( )成员函数表示纯虚函数。 A)virtual int vf(int); B)void vf(int)=0; C)virtual void vf()=0; D)virtual void vf(int){} 66、有如下类声明:class XA { private: int x;

public: XA(int n){ x=n;} }; class XB: public XA { private: int y;

public: XB(int a,int b); }; 在构造函数XB的下列定义中,正确的是( )。

A)XB::XB(int a,int b): x(a),y(b){ } B)XB::XB(int a,int b): XA(a),y(b){ } C)XB::XB(int a,int b): x(a),XB(b){ } D)XB::XB(int a,int b): XA(a),XB(b){ } 68、应在下列程序划线处填入的正确语句是( )。 class Base { public:

void fun(){cout<<\"Base::fun\"<{ //显示调用基类的函数fun() cout<<\"Derived::fun\"<fun();

三、指出并改正下列程序段中的语法错误。

题目 1. float x=3.26f; int &ref1=x; 1.float &refl=x; 答案

2. 2.去掉const int d1=3, d2=2; int * const dp=&d1; dp=&d2; *dp=5; 3.int改为Nums 3. //Nums为已定义的类 Nums *fp; fp=new int[4]; 4. void func(int first, int 2_secnd); 2、指出并改正下列程序段中的语法错误。

题目 1. int x=13; const int &ref=x; ref=10; 2. double *fp; fp=new int(3); 4.void func(int first ,int secnd); 数字不能在开头 答案 1.去掉const 2.double改成int 3. void func( first, int secnd); 4. //Pixel有两个整型成员x和y,其拷//拷贝构造函数定义如下: void Pixel(const Pixle& p); }

3.void func(int first,int secnd); 4 Pixel(const Pixle &p);

6、程序填空,直接将答案写在空行上 五、写出程序的运行结果

6. (3分) #include class Count{ static int count; public: Count(){count++;} static int Getc(){return count;} ~Count(){count--;} }; int Count::count=100; int main(void) { Count c1,c2; cout<1. (3 分) #include void main( ) //里面的void有没有一样 { char string[]=\"fortunate \"; char *p=string; cout< a是奇数 void main() { 1 int a; cout<<\"please input a number:\"; cin>>a; switch(a%2) { case 0: cout<<\"a是偶数\"< class Point { int x,y; public: Point(int a=0,int b=0) {x=a; y=b;} void move(int xoffset,int yoffset) {x+=xoffset; y+=yoffset;} 第6题的运行结果: 102 105 102 otnt 3. ( 3 分) #include class Count{ static int count; public: Count(){count++;} static int Getc(){return count;} ~Count(){count--;} };

int Count::count=10; void main(void) { Count c1,c2; cout<1. (3 分) #include void main(void){ char str[]=\"safety\"; char *p=str; cout< void main(){ int a,b; int n=0; for(a=1,b=1;a<=100;a++) { if(b>=10) break; if(b%3==1) { b+=3; n++; continue; } } cout< class A{ int a1,a2; public: A(int i,int j){a1=i;a2=j;} void printA(){cout< class Pixel{ int x, y; public: static int count; Pixel(){count++;} ~Pixel(){count--;} }; int Pixel::count =0; int main() { Pixel p[6]; 4 10 3

Pixel p1=p[2]; cout<void printB(); }; B::B(int i,int j,int k):a(k,j){ b1=i; } void B::printB(){ a.printA(); cout< void main(void) { char string[]=\"successful \"; char *p=string; cout< int main( ) { int x,y; cout<<\"Input x,y:\"; cin>>x>>y; cout<<\"x=\"< class Pixel{ int x, y; public: static int count; Pixel(){count++;} ~Pixel(){count--;} Pixel(const Pixel & obj) { x=obj.x; y=obj.y; count++; } }; int Pixel::count =0; int main(){ Pixel p[5]; 4. (7 分) #include class A{ int a; protected: int protect; public: A(int x){a=x;protect=x+5;cout<<\"A\"<cout<六.判断下面程序的主函数中语句①~⑩的对错。 (10 分) #include class Base{ int a1; void seta1(int x){a1=x;} public: int a2; void seta2(int x){a2=x;} }; class DerivedB: protected Base{ protected: int b1, b2; void setb1(int x){b1=x;} public: void setb2(int x){b2=x;} }; class DerivedC: protected DerivedB{ int c1; void setc1(int x){c1=x;} public: int c2; void setc2(int y){c2=y;} void seta2(int y){Base::seta2(y);} void setb2(int y){b2=y;} };

int main(){ Base obja; DerivedB objb; DerivedC objc; obja.seta1(9); // ① objb.setb2 (4); // ② objc.setc2 (8); // ③ obja.a2=objb.b2+objc.c2;// ④ objb.setb1(18); // ⑤ objb.setb2(objc.c2);// ⑥ objc.Base::seta2(48);//⑦ objc.seta2(34); //⑧ objc.DerivedB::setb2(22);//⑨ objc.setb2(22); // ⑩ return 0; } //////////////答案如下:对√错× 题 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 答× 案 √ √ × × √ × √ × √

1、分析程序,回答所提出的问题 #include class B; class A { public:

A(int i) { a=i; }

friend int F(A &f1,B &f2);

private:

int a;

};

class B {

public:

B(int i) { b=i; }

friend int F(A &f1,B &f2);

private:

int b;

};

int F(A &f1,B &f2) {

return (f1.a+f2.b)* (f1.a-f2.b); }

void main() { A n1(10); B n2(8);

cout<(1) 写出程序的运行结果。

(2) 该程序中共有几个对象,分别属于哪个类? 为什么在程序的开头处通过语句class B; 对类B进行声明?

(3) 程序中的哪两条语句会分别调用A、B的构造函数?写出这两个构造函数。 (4) 函数F是什么函数?它的作用是什么?

五、程序设计 (第一题7 分,第二题24分,共计31分)

1. 修改下面给出的程序,但不允许对main( ) 函数在作任何修改,使程序能够在屏幕上输出:(7分)

锄禾日当午, 汗滴禾下土。 谁知盘中餐, 粒粒皆辛苦。 原来的程序为: #include void main(void) {

cout<<\"汗滴禾下土。\"< class Base { public: Base() { } ~Base()

{cout<<\"谁知盘中餐,\"<Base ba; //不能改main就加个全局对象。 void main(void) {

cout<<\"汗滴禾下土。\"<2. 定义一个字符串类String,有两个私有数据成员:char* content和int len;要求:

1)在构造函数中提示用户输入字符串;

2) 用户能提取和显示字符串;(分别由两个函数完成) 3)实现对字符串中所有小写字母变成大写,并显示。

4)在主函数中定义String类对象,并对的对所有成员函数进行测试。 注意内存的分配与释放。 (15分)

3.请编写程序声明一个基类Employee,从它派生出类Technician,在主函数中将一个动态分配的Technician的对象地址赋值给一个Employee的指针,然后通过指针释放对象空间。可以不声明数据成员,但要声明适当的析构函数释放内存。(7分)

cout<<\"粒粒皆辛苦。\"<4. 一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为20元/米,过道造价为15元/平方米。过道宽度为4米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。 (10分)

游泳池

过道 5. 定义一个职工类Emplyee,有私有数据成员:姓名、序号和公司,并为它定义带参数的构造函数、拷贝构造函数、析构函数和输出数据成员值的公有成员函数print,在主函数中定义两个派生类对象对所有成员函数进行测试。(10分) 6. 定义一个学生类Student,具有三个属性:学号(long int)、姓名(char*)及年龄(int),其中括号内注明了此属性值的数据类型,并要求自动生成学号;具有三个公有成员函数:带参数的构造函数,析构函数及print()(用于输出3个数据成员的值),在主函数中定义Student类的两个对象(其中一个动态创建)对Student类进行测试。(共10分)

因篇幅问题不能全部显示,请点此查看更多更全内容