选择题
1. 在 C++中,函数原型不能标识 ( D )
2. 在 C++程序中,对象之间的相互通信通过
( B )
A. 继承实现 B. 调用成员函数实现 C. 封装实现 D. 函数重载实现 3. 对于任意一个类,析构函数的个数最多为( B )
4. 友元关系不能 ( A )
A. 继承 B. 是类与类的关系 C. 是一个类的成员函数与另一个类的关系 D. 提高程序的运行效率 5. 语句 ofstream f( ″″ ,ios::app | ios::binary)
? 的功能是建立流对象
f ,试图打开文件
与之连接,并且 ( A )
A.
若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B.
若文件存在,将其置为空文件;若文件不存在,打开失败 C.
若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件 D. 若文件存在,打开失败;若文件不存在,建立一个新文件
6. 下面说法正确的是 ( B )
A.
内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 B.
内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 C. 类的内联函数必须在类体内定义
7. 可以用 的形式访问派生类对象 p 的基类成员 a,其中 a 是 ( D ) A. 私有继承的公有成员
B.
公有继承的私有成员 C.
公有继承的保护成员 D. 公有继承的公有成员
8. 在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是 ( C )
A.
派生类的对象可以赋给基类的对象 B.
派生类的对象可以初始化基类的引用 C.
派生类的对象可以直接访问基类中的成员 D. 派生类的对象的地址可以赋给指向基类的指针
9. 派生类对象可访问基类中的什么成员( A ) A.
公有继承的公有成员 B.
公有继承的私有成员 C.
公有继承的保护成员 D.
私有继承的公有成员
10. 定义析构函数时,应该注意 (C) A. 其名与类名完全相同
并
B. 返回类型是 void 类型
C. 无形参,也不可重载
D. 函数体中必须有 delete 语句
11. 如果类 A 被说明成类 B 的友元,则 ( D ) 。 A. 类 A 的成员即类 B 的成员 B. 类 B 的成员即类 A 的成员 C. 类 A 的成员函数不得访问类 D. 类 B 不一定是类 A 的友元
12. 面向对象程序设计将数据与 ( A ) 放在一起,做为一个相互依存、不可分割的整体来处理。 A. 对数据的操作 A. 参数
B.
信息
C. C. 操作
数据隐藏
D. 标识符
D. 数据抽象
13. 在类中声明转换函数时不能指定 ( A ) 。
B. 访问权限
14. 在派生类中重新定义虚函数时必须在( A ) 方面与基类保持一致。 A. 参数类型
B. 参数名字
C. 操作内容
D. 赋值 C )。
B 的成员
15. 下面关于 C++中类的继承与派生的说法错误的是( A.基类的 protected B.基类的 protected
成员在公有派生类的成员函数中可以直接使用 成员在私有派生类的成员函数中可以直接使用 成员在保护派生类的成员函数中可以直接使用
C.公有派生时,基类的所有成员访问权限在派生类中保持不变 D.基类的 protected A.友元
B.虚
16. 重载赋值操作符时,应声明为 ( C ) 函数。
C.
成员
D.多态
B)
17. 在下面选项中,对类的拷贝构造函数的声明形式是( 18. 下面关于成员函数特征的描述中,错误的是( A.成员函数不可以设置参数的默认值 B.成员函数可以重载 C.成员函数可以是内联函数 D.成员函数可以是静态的
19. 下面关于类模板叙述不正确的是( A.可以有多个构造函数
B. 类模板是模板类的实例
C. 一个类模板可以用来实例化多个模板类
D. 类模板可以有多个参数
A. A::A(&) B. A::A(const A&) C. A::A(A) D. void A::A(A&a)
A)
B ) 20. 要使一个类成为抽象类,这个类应具有的条件是( A.至少有一个纯虚函数 B. 至少有一个虚函数
C. 只含有一个纯虚函数
D. 只含有一个虚函数
A)
21. 有关运算符重载正确的描述是(D )
22. 下列说法正确的是( D )。
A. B. C. D.
一个类的对象可以是另一个类的成员 一个类可以作为另一个类的派生类 一个类可以在另一个类定义体进行定义 以上说法均正确
B.
析构函数
C.
友元函数
D.
拷贝构造函数
23. 下列各类函数中, ( C)不是类的成员函数。 A. 构造函数 24. A. B. C. D.
派生类的对象对它的基类成员中(A )是可以访问的。
公有继承的公有成员 公有继承的私有成员 公有继承的保护成员 私有继承的公有成员
25. 下面有关构造函数和 new运算符关系正确的说法是(D ) A. new 运算符不调用构造函数 B. 构造函数一定调用
new 运算符
new 运算符,然后调用构造函数进行初始化
new 运算符也自动调用构造函数
C.当生成新类的实例时,先调用
D. 当 new运算符动态产生类的对象时, 26. 下面有关类性质的说法错误的是(
D ) A. 一个类可以有多个构造函数,但只有一个析构函数
B. 析构函数和构造函数都不能有返回类型
C. 不能给析构函数指定参数
D. 一个类中不可以声明具有类类型的数据成员
27. 下面关于友元函数描述正确的是( A.友元函数是类的成员 B.友元函数在类的外部声明 C.友元函数在类中声明 D. 友元函数能够派生
28. 下面叙述正确的是( D ) A. 派生类不可以使用私用派生 C. 对基类成员的访问允许二义性 A. 公有继承时基类中的 B. 公有继承是基类中的
C)
B. D.
保护派生时,基类的保护成员在派生类中是公有的 赋值兼容规则也适用于多重继承的组合
29. 下面描述中,表达错误的是(B )
public 成员在派生类中仍是
public 的 private
private
成员在派生类中仍是 的
C. 公有继承时基类中的 protected 成员在派生类中仍是 protected D. 私有继承时基类中的 public 成员在派生类中是 private 的 30. 拷贝构造函数的参数是(
C)
的
A. 某个对象名 B. 某个对象的成员名 C. 某个对象的引用名 D. 某个对象的指针名 31. 下列关于构造函数的描述中,错误的是(
D )
A.构造函数可以设置默认参数 B. 构造函数在定义类对象时自动执行 C.构造函数可以是内联函数 D. 构造函数不可以重载
32. 数组作为函数的形参时,把数组名作为实参,传递给函数的是( A.该数组的首地址 B.该数组的元素个数 C.该数组中的各元素值 D.该数组的大小
33. 通过一个析构函数调用虚函数时,C++系统对该调用采用 ( B ) 。 A. 动态联编 B.
静态联编 C.
不确定是哪种联编
D. 函数重载
34. 下面有关重载函数的说法中正确的是( C)
A.重载函数必须具有不同的返回值类型; B.重载函数形参个数必须;
C.重载函数必须有不同的形参列表; D.重载函数名可以不同;
35. 使用 string 类建立对象的不正确方式是( D)。 A. string str( “ OK” ) ; B. string str= ” OK”;
C. string str ; D. string str=
’ OK’ ;
36. 关于 C++中类的继承与派生的说法错误的是( C) A.基类的 protected 成员在公有派生类的成员函数中可以直接使用
B.基类的 protected
成员在私有派生类的成员函数中可以直接使用
C.私有派生时,基类的所有成员访问权限在派生类中保持不变 D.继承可以分为单一继承与多重继承
37. 一个类的析构函数( A )
A. 唯一的
B. 允许重载 C. 至多可有两个
D. 只能是缺省的38. 下面关于静态成员描述正确的是(
B)
A. 静态成员是对象的数据成员
B. 静态成员是对象的成员
C. 静态成员是对象的成员函数
D.
静态成员不是对象的成员
A)
39. 下面叙述正确的是( D)
A.基类的保护成员在派生类中仍然是保护的 B.基类的公有成员在派生类中仍然是公有的 C.基类的私有成员在派生类中是私有的 D.从基类派生时,可以有
A. inline
3 种派生方法 B. virtual
40.说明内联函数的关键字是(
)。
C. define
B. 无参构造函数 D. 赋值重载函数 C. stdout
)
D. static )
41.假定 CAb为一个类,则执行 CAb oX;语句时将自动调用该类的(
A. 有参构造函数 C. 拷贝构造函数 A. ostream A. void A. 类 A. 私有的 A. 重载函数 A. 无特殊要求
42. cin 是某个类的标准对象的引用,该类是(
)。
B. istream D. stdin
43.下面的哪个保留字不能作为函数的返回类型?(
B. int B. B. B.
C. new )。
C. 函数模板 C. 保护的 ) C. 虚函数 )。
D. long
44.不能参与重载的运算符是(
函数 公有的 继承
D. 运算符 )。
D. 不可访问的
45.由于数据隐藏的需要,静态数据成员通常被说明为(
46.编译时多态性使用什么获得?( 47.拷贝构造函数的参数通常是(
D.B 和C
B. 指向对象的指针 D. 对象
C. 自已类对象的常引用 48. C++有几种联编?(
A.1 种
)
B. 2 种 C.3 种 )。
D.4 种
49.基类和派生类可以分别称为(
A. “大类”和“小类”
B. “父类”和“子类” D. “子类”和“父类”
A
C. “小类”和“大类”
50.下列对类的构造函数和析构函数描述正确的是( A) 构造函数可以重载,析构函数不能重载 B) 构造函数不能重载,析构函数可以重载 C)构造函数可以重载,析构函数可以重载 D)构造函数不能重载,析构函数不能重载 51.在函数定义前加上关键字“ A)重载函数 C)成员函数
B D
)。
inline ”,表示该函数被定义为( B
)。
)内联函数 )普通函数
52.下面有关重载函数的说明中, ( C )是正确的。
A) 重载函数必须具有不同的返回值类型 B) 重载函数形参个数必须不同 C) 重载函数必须具有不同的形参列表 D) 重载函数名可以不同 53.已知 : print( )
。
函数是一个类的常成员函数,它无返回值,下列表示中,正确的是
( A )
A) void print( ) const C) void const print( ) A) void
~ Myclass( );
D)
; ; B)
B) const void print( ) D) void print(const)
)
;
为该类的析构函数。 54.假定 Myclass 为一个类 , 那么下列的函数说明中 ( D
~ Myclass( int n); ~ Myclass( ) 处错误。
C) Myclass( );
55.下面类的定义中有 ( C )
~myclass(value); } A) 1 B)2 C)3 D)4 A. inline
A. ostream
class myclass{int i=0; public: void myclass( );
56.说明虚函数的关键字是(
B
)。
C. define
A
C. stdout D)。 B. virtual B. istream
D. static
)。
D. stdin
57. cout 是某个类的标准对象的引用,该类是(
58、一个类的所有对象共享的是(
A. 私有数据成员 C. 保护数据成员 A. 返回值
B. 公有数据成员 D. 静态数据成员
B 指针 )。
59.静态成员函数没有(
B. this C. 指针参数 D. 返回类型
60. 关于 C++与 C语言关系的描述中, ( D )是错误的。
语言是 C++语言的一个子集 语言与 C++语言是兼容的 ++ 语言对 C 语言进行了一些改进 ++ 语言和 C 语言都是面向对象的
61.按照标识符的要求, ( A )符号不能组成标识符。 A. 连接符 C. 大小写字母 A. 缩排位置相同的
if
B.
D.
B. if D.
下划线 数字字符
62. 为了避免嵌套的 if-else 语句的二义性, C 语言规定 else 总是与( C )组成配对关系。
在其之前未配对的 同一行上的 if
中, A[2][2] 的值是(
C )。
if
C. 在其之前未配对的最近的
63. 在\
64. 设\ ; \ ,以下正确的表达式是(
B)。
=\ B.*s=\
C.**s=\
D.*s='C';
\ 的描述中,( D )是正确的。 65. 对于 \;
是一个指向数组的指针,所指向的数组是
5 个 int 型元素
是一个指向某数组中第 5 个元素的指针,该元素是 int
型变量 [5] 表示某个元素的第 5 个元素的值
是一个具有 5 个元素的指针数组,每个元素是一个
int 型指针
66. 在下列表示引用的方法中, ( A)是正确的。
已知: int m=10;
&x=m;
&y=10;
&z;
&t=&m;
67. 下列 for 循环的次数为( B )。
for ( i=0, x=0; !x&&i<=5; i++
) D.
无限
68. 对于 C/C++语言的函数,下列叙述中正确的是(A)。 A. 函数的定义不能嵌套,但函数调用可以嵌套 B. 函数的定义可以嵌套,但函数调用不能嵌套
C. 函数的定义和调用都不能嵌套
D. 函数的定义和调用都可以嵌套 69.
在一个被调用函数中,关于return 语句使用的描述, ( D )是错误的。
A. 被调用函数中可以不用 return 语句 B. 被调用函数中可以使用多个return 语句
70. 在一个函数中, 要求通过函数来实现一种不太复杂的功能, 并且要求加快执行速度,( A )。
A. 内联函数 B. 重载函数 C. 递归调用
D.
嵌套调用
71. ( D ) 不是构造函数的特征 A. 构造函数的函数名与类名相同 B. 构造函数可以重载
C. 构造函数可以设置缺省参数 D. 构造函数必须指定类型说明
72. 已知:类 A 中一个成员函数说明如下: voiD Set(A&A);
其中, A&的含义是 ( C ) 。 A. 指向类 A 的指针为 A
选用
B. 将 A 的地址值赋给变量 Set
是类 A 对象的引用,用来作函数 D. 变量 A 与 A 按位与作为函数
Set ()的参数
Set( ) 的参数
73. 已知: print( ) 函数是一个类的常成员函数, 它无返回值, 下列表示中,( A )是正确的。 print( ) const; const print( );
void print( ); print(const);
74. 关于虚函数的描述中, ( C )是正确的。
B. 虚函数是一个非成员函数
C. 基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数
D. 派生类的虚函数与基类的虚函数具有不同的参数个数和类型
75. 关于 new 运算符的下列描述中, ( D )是错的。
A. 它可以用来动态创建对象和对象数组
C. 使用它创建对象时要调用构造函数 D. 使用它创建对象数组时必须指定初始值
;则 *p 的值是 ( B ) B D B
) 3 )无意义
) C 语言与 C++是兼容的; D ) C++和 C 语言都是面向对象的。 ( A ) 是错误的。
76.若有定义 int a=3, *p=&a A)常量 a 的地址值 C)变量 p 的地址值
A) C语言是 C++的一个子集;
77.在下列关于 C++与 C语言关系的各描述中, ( D ) 是错误的。 C) C++对 C 语言进行了一些改进; 78.在下列关于类概念的各描述中, A)类就是 C 语言中的结构体类型;
B)类是具有共同行为的若干对象的统一描述体; C)类是创建对象的样板; D)类是抽象数据类型的实现。 79.采用函数重载的目的在于 A) 实现共享 C) 提高速度 A)构造函数 C)友元函数
B D B D
( D )
)减少空间
)使用方便,提高可读性
)析构函数
)拷贝初始化构造函数 static ;
<类名 >和作用域分辨符;
80.下列的各类函数中, ( C ) 不是类的成员函数。
81.下列静态数据成员特性中, ( D ) 是错误的。 A) 说明静态数据成员时前边要加修饰符
B) 静态数据成员要在类体外进行初始化; C) 引用静态数据成员时,要在静态数据成员名前加 D) 静态数据成员不是所有对象共有的。
82.以下各选项中,正确的函数声明是
A) double func( int x
( C )
, int y )
;
B) int func( int x C) float func( int x
; int y ) , int y )
; D) char func( int x , y )
;
填空题
1. 定义类的动态对象数组时,系统只能够自动调用该类的
( 无参 ) 构造函数对其进行初始化。 ( 单一)继承。
2. 在 C++程序设计中,建立继承关系倒挂的树应使用
3. 表达式 cout< 4. 基类的公有成员在派生类中的访问权限由( 访问控制 ) 决定。 ++支持的两种多态性分别是编译时的 (操作重载) ( 静态)多态性和运行时的 (虚函数)(动态)多态性。 ++中语句 const char * const p= 变(重新赋值) )。 ″ hello ″;所定义的指针 p 和它所指的内容都不能被(改 7. 假定 AB 为一个类,则语句 AB(AB&x);为该类(拷贝)构造函数的原型说明。 8. 将关键字 const 写在成员函数的(函数头)和(函数体)之间时,所修饰的是 this 指针。 9. 在 C++中,访问一个对象的成员所用的运算符是(· ),访问一个指针所指向的对象的成员所用的运算符是( ->) 。 10. 派生类从一个或多个以前定义的该类的(基类)。 11. 运算符重载时,其函数名由(operator 运算符) 构成。成员函数重载双目运算符时, 左操作数是(当前对象) ,右操作数是(函数形参) 。 12.C++支持面向对象程序设计的四个要素是: 13.模板分为(类)模板和(函数)模板。 14. 15. 16. 17. ( 封装性 ) 、( 继承性 ) 、( 抽象性 ) 和( 多态性 ) 。 。 定义内联函数所用的关键字( inline ),定义友元所用的关键字为( friend )。 当一个派生类具有多个基类时,这种继承方式称为(多重继承)。 通过一个构造函数调用虚函数时,C++系统对该调用采用(静态)联编。 任何类中允许有( private )、( public )、(protected )三种访问控制类型的成员,数据成 员和成员函数的默认类型为( private )。 18. 只有在(公有)继承的情况下,基类和派生类之间才有赋值兼容性规则。 19. 运算符重载使用的两种方式是(成员函数)和(友元函数)。 20.成员名限定的符号是( ::),它可以在引用成员时避免(二义性) 。 和 long DBL(long n){return n+n;} 21. 在用 class 定义一个类时,数据成员和成员函数的默认访问权限是( 22. 已知 int DBL(int n){return n+n;} 的两个实例,则该函数模板的定义是 privated) 。 是一个函数模板 (template 。(要 求写出函数模板的完整定义) 23. 静态数据成员必须在 ( 类外 ) 进行初始化。 24. 含有纯虚函数的类称为 ( 抽象类 ) 。 25. 若 Queue 是一个类, aQueue是它的一个对象, 而且该类中定义了一个静态成员函数show() 则在类外对该成员的函数进行调用的方式可以为 26. 定义内联函数所用的关键字为 (inline) ()) 和(Queue::show()) 。 (friend) 。 ,定义友元所用的关键字为 27. 使用成员函数重载运算符时, 若运算符是二元的, 则参数表中有 (1) 个操作数, 此时 ( 当前 对象 ) 作为此运算符的左操作数。 28、 C++程序中,对象的初始化和清理工作,分别由两个特殊的成员函数(构造函数)和(析 构函数)来完成。 29、在 c++中,分别用(变量)与(函数)来表现某种事物的所具有的属性和行为,并且将它 们封装在一起,形成一种抽象数据类型——(类) 。 ,其特殊之处在于:形参是() 。 30、当用一个对象初始化另一个新的同类对象,将调用() 性的一个方面。 31、模板是 C++支持参数化的工具,我们通常用类模板和函数模板,这些只是面向对象的() 32、如果在某个类定义中用关键字()声明了一个外部函数(也许是其他类的一个成员)后, 这个外部函数就可以例外的访问该类的任何成员,这个外部函数称为类的()函数。 33、可以将类的成员声明为 static ,使其成为()。这样的成员在编译时被创建,其实例只有 一个,为所有该类的对象() 。 34、()是动态动态联编的基础。它是非静态的成员函数,经过()之后,在类族中可以实现 运行过程中的多态。 35、程序中有如下语句: int a=30;int b=a++;int c=++a; 数组 A[20][20] 则 b=( ),c= () 10 个元素的地址空间: ( ) 中,第一个元素是() ,最后一个元素是() 。 36、声明一个 int 型指针,请为其动态分配含 37.在类中必须声明成员函数的(原型) 38.如果需要在被调函数运行期间, 用)类型或 (指针)类型。 ,成员函数的(实现)部分可以写在类外。 则函数的形参应该是 (引 改变主调函数中实参变量的值, 39.(抽象)类只能作为基类使用,而不能声明它的对象。 40.进行函数重载时,被重载的同名函数如果都没有用 (类型)必须不同。 const 修饰,则它们的形参(个数)或 41.通过一个(常)对象只能调用它的常成员函数,不能调用其他成员函数。 42.函数的递归调用是指函数直接或间接地调用(自身) 43.拷贝构造函数的形参必须是(本类对象的引用) 。 。 44.设函数 max 是由函数模板实现的,并且 max, 5) 和 max(3, 5) 都是正确的函数调用,则此函数模板具有( 2 )个类型参数。 45.在 C++中,函数重载与虚函数帮助实现了类的(多态)性。 46.由 static 修饰的数据成员为该类的所有对象(共享) delete 。 。 )释放所占用的空间。 47.重载函数在参数类型或参数个数上不同,但(函数名)相同。 48.使用 new建立的动态对象在不用时必须用( 49.重载运算符”-” 的函数名为 ( oprator- ) 50. C++中类的用途有两种 , 一种是类的实例化 , 即生成类的对象 , 另一种是通过 ( 继承 ) ,派生出新的类。 51.编译时多态性可以用( 重载 )函数实现。 52.一个 C++程序的执行从( main)函数开始,到 ( main)函数结束 。 53.在 C++ 中, 函数在定义时可以预先定义出默认的形参值。 默认形参值必须按 (从右到左) 的顺序定义。因为在调用时,实参初始化形参是按(从左到右)的顺序。 54.类是逻辑上相关的(函数)与(数据)的封装。特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的 ( 继承 ) 。 55.在 C++中,函数的参数有两种传递方式,它们是值传递和 56.当一个成员函数被调用时,该成员函数的( ( 地址或指针或引用传递 ) 。 this 指针)指向调用它的对象。 对两个有相同名字的 57.在基类和派生类中, 派生类可以定义其基类中不具备的数据和操作。 数据成员进行访问时,如果没有(作用域分隔符限定时) 58.拷贝构造函数使用(引用)作为参数初始化创建中的对象。 59.在公有继承的情况下,基类数据成员在派生类中的访问权限(保持不变) 参数)构造函数,否则应用程序会产生一个编译错误。 ,对此数据成员的访问将出现歧义。 。 60. 用 new 申请某一个类的动态对象数组时,在该类中必须能够匹配到(没有形参的或缺省61.静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象(共享) 62.为了避免可能出现的歧义, 的 if )配对。 。 C++对 if else 语句配对规则规定为: else 总是与(与最近 63. 面向对象的程序设计有四大特征,它们是抽象、封装、 (继承)、 (多态)。 ;在基类 参数个数、 64. 在 C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型(不同) 和派生类中, 成员函数的覆盖是指 (派生类成员函数与在基类被覆盖的成员函数名、 参数类型和返回值类型均相同) 。 65. 构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与类 名相同, 而析构函数名是在类名前加一个 数)。 ~、(析构函数没有参数) 、(析构函数可以定义为虚函 66. 动态联编要满足两个条件,它们是(被调用的成员函数是虚函数) 虚函数)。 、(用指针或引用调用 67. 在 C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为(抽象类) 该类至少具有一个(纯虚函数) 。 ,定义 68. 在 C++类中, const 关键字可以修饰对象和成员函数, 成员函数不能(修改类数据成员) 。 const 对象不能(被修改) ,const 69. C++中没有字符串类型,字符串是通过(字符数组)来表示的,每一个字符串都有一个结 尾字符( \\0 )。 70. C++中没有输入输出语句,输入输出是通过(输入输出库)实现的, 变量 n 的输出语句:( cout< 写出一条打印整型 71. 举出 C++中两种代码复用的方式: (继承)、 (重载)。 判断正误题 (判断正误,在题后的括号内,正确的划上“√”错误的划上“×” 1.不可以定义抽象类的对象。 2.内联函数的定义必须出现在第一次调用内联函数之前。 3.模板函数与函数模板的意义完全相同。 4.只有常成员函数才可以操作常对象。 5.引用可以不初始化。 。 ) ( √ ) ( √ ) ( × ) ( √ ) ( × ) 6.构造函数可以设置默认参数 7.类的析构函数的作用是对象的初始化8. cout 的默认输出对象是键盘 , cin 9.抽象类可以用来直接创建对象。 10.常对象可以调用任意成员函数。 的默认输入对象是屏幕 ( √ )( × )( × ( × )( × ) ) 简答题 1、 虚析构函数有什么作用? 解答要点: 对象销毁时, 需要调用析构函数。 在多态调用时, 是用基类的指针访问派生类的对象。 如果析构函数是非虚函数, 则基类指针只能访问基类的析构函数, 而不能访问派生类的析构函数,导致派生类对象销毁时, 没有调用派生类的析构函数, 只是调用了基类的析构函数。 如果把析 构函数定义成虚函数,则可克服这个问题。 2、 拷贝构造函数在哪几种情况下调用? 解答要点: 用一个对象初始化另一个对象时 当用对象作为函数参数传递时 当函数返回对象时 3、 函数重载与函数覆盖有什么不同,它们与多态有什么关系? 解答要点: 函数重载是指函数名相同, 而函数的参数个数或类型不同; 覆盖是指在派生类中成员函数 与基类成员函数的函数名、参数个数、类型与返回值均相同; C++中正是通过虚函数的覆盖,实现多态的功能。 4、 C++继承是如何工作的? 答:继承使得派生类能够使用基类的公有和保护成员, 从而实现代码的复用, 派生类可以增加成员, 也可以隐藏和覆盖基类的成员。 对于公有继承, 基类成员的访问权限在派生类保持不变。 5、 类与对象有什么区别? 答:类是类型,是对象的抽象,对象是类的具体实例。一个类可以有多个对象,每个对象 都有自己的存储单元,而类不占存储单元。 6. 若程序员没有定义拷贝构造函数, 产生什么问题? 则编译器自动生成一个缺省的拷贝构造函数, 它可能会 解答要点: 当对象含有指针数据成员, 并用它初始化同类型的另一个对象时, 缺省的拷贝构造 函数只能将该对象的数据成员复制给另一个对象, 而不能将该对象中指针所指向的内存单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。 7. 简述成员函数、全局函数和友元函数的差别。 解答要点:以下几点必须说清楚: 成员函数是在类内部定义的, 作用域在类的内部, 成员函数可以访问类的数据成员 (公有、 保护和私有数据成员) ,可以调用该类的其它成员函数 用全局函数。 如果友元函数是另一个类的公有成员函数, 的对象调用, 不能调用那个类的保护和私有成员函数。 (公有、 保护和私有成员函数) ,可以调 则该类的成员函数也只能通过那个类 非本类成员函数 (其它类成员函数或全 局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。 不是在类中定义的成员函数都是全局函数。 如果某一个函数 (全局函数或类的成员函数) 定义为另一个类的友元函数, 需要在那个类中用 friend 关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。 8. 简述结构化的程序设计、面向对象的程序设计的基本思想。 解答要点: 结构化的程序设计将数据和对数据的操作分离, 程序是由一个个的函数组成的, 面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。 9. 结构 struct 和类 class 有什么异同? 解答要点: struct 和 class 都可以定义类, 但是缺省访问权限说明时, 的成员是私有的。在 C++中, struct 可被 class 代替。 struct 的成员是公有的, 而 class 程序阅读分析题 7 分 ) 。 1、分析程序,写出程序的输出结果( #include class Clock { private : int Hour, Minute , Second; public : void SetTime ( int NewH=24, int NewM=24, int NewS=24) { Hour=NewH; Minute =NewM; Second=NewS;} void ShowTime(){ cout < }; void main() { cout <<\ < Clock MyClock; (); (); (8,30,30); (); } 输出结果: time set and output: 24:24:24 8:30:30 2 、分析程序,写出程序的输出结果( 7 分)。 #include using namespace std ; class point { private : int x, y; public : point ( int xx =0, int yy=0){ x=xx ; y=yy; cout <<\构造函数被调用 point ( point & p); int GetX(){ return x;} int GetY(){ return y;} }; point :: point ( point & p) { x=; y=; cout <<\拷贝构造函数被调用 \ } void main() { point A(4,5); point B( A); cout <<()<< endl ; } 输出结果: 构造函数被调用 拷贝构造函数被调用 4 3. 在括号中注释相应的语句( 8 分) #include using namespace std ; n\ delete pa; } ( 1) ( 2) \ ( 3) ( 4) ( 5) 4.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均 值为本小题得分。 ( 1)程序: #include using namespace std ; class Base { private : char msg[30]; protected : int n; public : { strcpy ( msg, s); } void output ( void ) { cout < }; class Derived1 : public Base { private : int n; public : Derived1 ( int m=1): Base( \{n=m; } void output ( void ) {cout < Base:: output (); } }; class Derived2 : public Derived1 { private : int n; public : Derived2 ( int m=2): Derived1 ( m-1) { n=m; } void output ( void ) {cout < } }; int main() { Base B( \,1); Derived2 D; (); (); } 运行结果: 1 Base Class 2 1 0 Base ( 2)程序: #include class Samp { public : void Setij ( int a, int b){ i =a, j =b;} ~Samp() {cout <<\ } int GetMuti (){ return i * j ;} protected : int i ; int j ; }; int main() { Samp* p; p=new Samp[5]; if (! p) { cout <<\ ; return 1; } for ( int j =0; j <5; j ++) p[ j ]. Setij ( j , j ); for ( int k=0; k<5; k++) cout <<\< < delete [] p; return 0; } 运行结果: Muti[0] is:0 Muti[1] is:1 Muti[2] is:4 Muti[3] is:9 Muti[4] is:16 Destroying..4 Destroying..3 Destroying..2 Destroying..1 Destroying..0 5.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均 值为本小题得分。 ( 1)程序: #include using namespace std ; class Vector { public : Vector ( int s=100); int & Elem( int ndx); void Display ( void ); void Set ( void ); ~Vector ( void ); protected : int size ; int * buffer ; }; Vector :: Vector ( int s) { buffer =new int [ size =s]; } int & Vector :: Elem( int ndx) { if ( ndx<0|| ndx>=size ) { cout <<\ exit (1); } return buffer [ ndx]; } void Vector :: Display ( void ) { for ( int j =0; j cout < } void Vector :: Set( void ) { for ( int j =0; j Elem( j )= j +1; } Vector ::~ Vector ( void ) { delete [] buffer ; < } int main() { Vector a(10); Vector b( a); (); (); } 运行结果: 1 2 3 4 5 6 7 8 9 10 最后出现错误信息, 原因是:声明对象 b 是进行的是浅拷贝, b 与 a 共用同一个 buffer ,程 序结束前调用析构函数时对同一内存区进行了两次释放。 6.阅读下面程序,写出输出结果。 #include class CPosition { public : CPosition ( int { m_iPositionY = iPositionY ; } iPositionX = 0, int iPositionY = 0): m_iPositionX ( iPositionX ) int GetPositionX () const { return m_iPositionX ; } int GetPositionY () const { return m_iPositionY ; } void SetPositionX ( int iPositionX ) { m_iPositionX = iPositionX ; } void SetPositionY ( int iPositionY ) { m_iPositionY = iPositionY ; } private : int m_iPositionX ; 序分析题(本大题共 5 小题,每小题 4 分,共 20 分)给出 : 下面各程序的输出结果。 #include int a; 1.若有以下程序 public : A( int aa = 0 ){ a = aa; } ~A(){ }; cout << \ << a << endl ; } class B: public { A int b; public : B( int aa = 0, ~B() { int bb = 0): A( aa) { b = bb; } cout << \ << b << endl ; } }; int main() { B x(5), y(6,7); return 0; } 上面程序的输出结果为: Destructor B! 7 Destructor A! 6 Destructor B! 0 Destructor A! 5 2.若有以下程序 : #include class Point { int x, y; public : Point () { x = 0; y = 0; } x = x1; y = y1; } << \ y << endl ; } void SetPoint ( int x1, int y1) { cout << \ x << \ void DisPoint () { }; int main() { Point * p = new Point ; p-> SetPoint (5, 12); p-> DisPoint (); delete p; return 0; } 上面程序的输出结果为: x=5,y=12 3.若有以下程序 : #include void Fun() { cout << \}; class Derived : public Base { public : void Fun() { cout << \endl ; } }; int main() { Derived a; Base * p; p=&a; p-> Fun(); (); return 0; } 上面程序的输出结果为: 1 2 endl ;} 4.阅读下面程序,写出输出结果。 #include class Point { public : Point ( int x = 0, int y = 0): m_x( x), m_y( y){ } int GetX() const { return m_x; } int GetY() const { return m_y; } void SetX( int x) { m_x = x; } void SetY( int y) { m_y = y; } private : int m_x; etint ( )<< \<< array [1]. getfloat ()<< } 结果: Initalizing default Initalizing default 0 0 Desdtructor is active Desdtructor is active 程序填空题 1.本程序用递归的方法计算 Fibonacci 数列的前 20 项。 Fibonacci 两项均为 1,从第三项开始,每一项都是其前两项的和。请补全 int fac( int n ) { } 2.本程序的功能是输出三角形式的九九乘法表。请在横线上填空。 3.在下面程序的横线处填上正确的语句 , 以实现动态多态。 程序改错题 1. class Base { int a; public : int b; endl ; 数列的规律是:数列前fac 函数。 int f( int i, int j); }; class Derived:Base{ int c; public : int Base::b; Base::f( int i, int j); }; [1] int base::b; 更改为 base::b; (或访问声明仅仅调整名字 的访问,不可为它说明任何类型) [2] base::f(int i,int j); 说明函数参数) 更改为 base::f; (或访问声明不应 2. #include <> class A{ public : void A( int i=0){m=i;} void show(){cout< int m; }; void main() { A a(5); +=10; (); } [3] void A(int i=0){m=i;} 数不能指定返回值类型) 更改为 构造函数去掉 void (或构造函 [4] void ~A(){} 返回值类型) 更改为析构函数去掉 void (或析构函数不能指定 [5] +=10; 更改为对象不能访问私有成员 3. #include using namespace std; class base{ int a; static public : base( int m, int n):a(m),b(n){} static static }; base:: int b=45; void main() { } int geta(){ return a;} int getb(){ return b;} int b; void show(){cout< [6] base(int m,int n):a(m),b(n){} 更改为不能通过构造函数初始 化静态数据成员(只要把 b(n) 去掉即可) [7] static int geta(){return a;} 用非静态成员数据成员(或去掉 更改为静态成员函数中不能引 static ) [8] base::int b=45; 更改为 int base::b = 45; 4. Template< class T> T fun(T x) { T y; y=T-2*x; return y; } [1] Template T 不能用作 - 的操作数 [2] 3. #include void setA( int ); private int void showA(); private : int a; }; class B { public : void setB( int ); void showB(); private : int b; }; class C : public A, private B {public : void setC( int , int , int ); void showC(); }; void A::setA( int x) { a=x; } void B::setB( int x) { b=x; } void C::setC( int x, int y, int z) { a=x; b=y; setA(x); setB(y); c=z; } [4] a=x; ( 派生类不能访问基类 A 类的私有成员 ) [5] b=y; ( 派生类不能访问基类 B 类的私有成员 ) [6] (6); (不能访问 B 类的公有成员 setB) [7] (); (不能访问 B 类的公有成员 showB) [8] return 0; ( 去掉此语句,或主函数的返回值int) : c; void去掉或改为 程序设计题 1.编写一个函数模板,用于求数组中各元素之和,并编写测试程序进行测试。 函数模板声明如下: template Type Sum(Type tArray[], int iSize) #include Type Sum(Type tArray[], int iSize) { Type tSum = 0; for (int i = 0; i < iSize; i++) { tSum = tSum + tArray[i]; } return tSum; } (10 分) int main(void) { int a[] = {1, 2, 3}; double b[] = {, , , 8}; cout << Sum(a, 3) << endl; cout << Sum(b, 4) << endl; return 0; } 2. 定义一个复数类 Complex, 二个数据成员为 double 型 r, i 为 private 属性。定义代二个参数的构造 函数和一个 Show( ) 函数用以输出 r, i 的值 , 另外作为成员函数重载的运算苻” +”的功能是将此类二个对象的数据成员 r 和 i 对应相加。 这些成员函数的属性均为 public. 请用 C++编写此程序 , 并编写测试程序进行测试。 ( 10 分) #include class Complex { private: double r, i; public: Complex(double a, double b): r(a), i(b) {} void Show() { cout << r << \Complex operator +(Complex obj) { return Complex(r + , i + ; } }; int main() { Complex c1, , c2, , c3, ; c3 = c1 + c2; (); return 0; } 3.设计一个类 DateInfo ,要求其满足下述要求: (10 分) ( 1)要求有一个无参的构造函数,其初始的年、月、日分别为: 2010,( 2)要求有一个带参数的构造函数,其参数分别对应年、月、日。 ( 3)要求用一个成员函数实现日期的设置。 ( 4)要求用一个成员函数实现日期的获取。 ( 5)要求用一个成员函数实现输出日期。 #include class DateInfo { private: int year, month, day; public: DateInfo(): year(2010), month(6), day(8){ } DateInfo(int y, int m, int d): year(y), month(m), day(d){ } void Set(int y, int m, int d) { year = y; month = m; day = d; } , 8。 6 void Show() { cout << year << \ 年 \ 月 \日\ }; int main() { DateInfo d1, d2(1988, 8, 18); (); (); (1999, 9, 19); (); return 0; } 4. 定义一个抽象类 CShape,它有一个纯虚函数 GetLength() ;派生出四边型类 ,在派生类中重载函数 CSquare 圆类 CCircle GetLength() ,用于求图形的周长,编写测试程序进行 测试。( 10 分) #include using namespace std; class CShape { public: virtual double GetLength() const = 0; }; class CSquare:public CShape { public: CSquare(double dWidth, double dHeight) { m_dWidth = dWidth; m_dHeight = dHeight; } double GetLength() const { return 2 * (m_dWidth + m_dHeight); } private: double m_dWidth, m_dHeight; }; class CCircle:public CShape { public: 和 CCircle(double dRadius) { m_dRadius = dRadius; } double GetLength() const { return * m_dRadius * m_dRadius; } private: double m_dRadius; }; int main(void) { CSquare oSquare(2, 3); cout << () << endl; CCircle oCircle(10); cout << () << endl; return 0; } 5. ( 8 分)下列 shape 类是一个表示形状的抽象类, area( ) 为求图形面积的函数, total( 则是一个通用的用以求不同形状的图形面积总和的函数。请从 shape 类派生三角形类(triangle) 、矩形类( rectangle ),并给出具体的求面积函数。 class shape{ public: virtual float area( )=0; }; float total(shape *s[ ],int n) { float sum=; for(int i=0;i class Triangle:public Shape { public: Triangle(double h,double w){H=h;W=w;} double Area() const{return H*W*;} ) private: double H,W; }; class Rectangle:public Shape { public: Rectangle(double h,double w){H=h;W=w;} double Area()const{return H*W;} private: double H,W; }; 8.(10 分 ) 完成下面的函数,对有 n 个元素的数组 a,使数组元素按逆序排列。 void inverse(int *a, int n) { int i,*p; p=new int[n]; for(i=0;i<=n-1;i++) p[i]=a[i]; for(i=0;i<=n-1;i++) a[i]=p[n-i-1]; delete []p; } 9. ( 12 分)下面的函数统计子字符串 substr 在字符串 str 中出现的次数,如果str 中不出现,则返回值 0。请完成该函数。 int str_count(char *substr, char *str) { int count=0; char *pChar; if(substr==NULL||str==NULL) return count; while(*str!='\\0'){ pChar=substr; while(*pChar==*str){ pChar++; if(*pChar=='\\0'){ count++;break; } else str++; }.) statement substr 在 str++; }.) statement return count; }
C++试题库.doc



