一、判断题
( )1、写在类体内的函数都是内联函数。
( )2、通常的拷贝初始化构造函数的参数是某个对象的指针名。 ( )3、重载运算符可改变原运算符的优先级和结合性。
( )4、在设置了默认参数值后,调用函数的对应实参就必须省略。 ( )5、析构函数是一种函数体为空的成员函数。
( )6、某类的友元类的所有成员函数可以存取或修改该类中的私有成员。 ( )7、对象数组的元素可以是不同类的对象。
( )8、函数的参数个数、类型及位置都相同,只是函数返回值类型不同,这不是重载函数。 ( )9、派生类是从基类派生出来的,但它不能再生成新的派生类。 ( )10、构造函数和析构函数都不能重载。
( )11、在公有继承中,基类中只有公有成员对派生类的对象是可见的。 ( )12、this指针是一个指向正在被某个成员函数操作的对象的指针。 ( )13、一维对象指针数组的每个元素应该是某个类的对象的地址值。 ( )14、在C++中,定义函数时必须给出函数的类型。 ( )15、析构函数是一种函数参数表为空的成员函数。 ( )16、派生类的继承方式有两种:公有继承和私有继承。 ( )17、自身类对象的引用不可以作为该类的成员。
( )18、多重继承情况下,派生类中对基类成员的访问不会出现二义性。 ( )19、可以在类的构造函数中对静态数据成员进行初始化。
( )20、多重继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序。 ( )21、在单继承情况下,派生类中对基类成员的访问不会出现二义性。 ( )22、转换函数不是成员函数,它是用来进行强制类型转换的。 ( )23、在公有继承中,基类中的保护成员对派生类对象是可见的。
( )24、虚基类是用来解决多继承中公共基类在派生类中只产生一个基类子对象的问题。 ( )25、在保护继承中,基类中的公有成员对派生类对象是可见的。 ( )26、抽象类是指一些不能定义对象的类。 ( )27、虚函数是用virtual关键字说明的成员函数。 ( )28、动态联编是在运行时选定所要调用的成员函数的。
( )29、声明派生类时,在派生类的头部都要明确列出其直接基类和间接基类。 ( )30、在C++中对于运算符重载,只能重载已有的运算符。 ( )31、在程序中可以直接调用构造函数。
( )32、解决多继承情况下出现的二义性的方法之一是使用作用域运算符。 ( )33、函数重载是一种多态现象,它属于动态联编。
( )34、友元函数、友元类的声明可以放在类定义中的任何地方。 ( )35、抽象类是一些不能实例化的类,即不能定义对象的类。
1
( )36、const对象不能随意被修改,但const成员函数可以修改const对象。 ( )37、拷贝初始化构造函数的参数只能是对某个对象的引用。
( )38、类的公有静态成员既可以用类的对象访问,也可以用作用域运算符通过类名访问。 ( )39、拷贝初始化构造函数的参数可以是某类的对象名。
( )40、在类体外定义的函数若没有关健字inline说明,则都是外联函数。 ( )41、C++中的所有函数调用都是传引用调用。 ( )42、析构函数说明为虚函数是没有意义的。
( )43、派生类的构造函数的成员初始化列表中,可以包含基类的子对象初始化。 ( )44、构造函数说明为虚函数是没有意义的。
( )45、对每个可重载的运算符来说,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。 ( )46、C++中的所有函数调用都是传值调用。
( )47、使用关键字class定义的类中,缺省的访问权限是公有(public)的。 ( )48、使用关键字class定义的类中,缺省的访问权限是私有(private)的。
( )49、如果一个成员函数只存取类的静态数据成员,则可将该成员函数说明为静态成员函数。 ( )50、说明和定义类的对象时,类名前面不需要加class关键字。 二、填空
1、如果一个函数没有返回值,定义时需用类型说明符___void___说明。 2、通常的拷贝初始化构造函数的参数是_____同类对象的引用______。 3、对象成员的表示与结构体成员的表示相同,使用运算符__.__或____。
4、已知:p是一个指向类A数据成员m的指针,a1是类A的一个对象,如果要给对象a1的数据成员m赋值为5,应____________
赋值。
5、C++中,继承分为单继承和__多继承___,而继承方式可分为__公有___、__私有____、____保护__。 6、任何类中允许有三种类型的成员,它们分别是__公有____、__私有_____、___保护____。 7、____作用域运算符____能够用来访问当前作用域内与局部变量同名的全局变量。
8、在类内部定义的___私有__和__保护___成员不能被不属于该类的成员函数来存取,定义为__公有____的成员则可以在类外
部进行存取。
9、静态数据成员的赋初值是在____类体外____进行。
10、C++的函数如果在返回类型、参数类型、参数个数、__参数顺序_____上有所不同,则认为是不同的函数(注:对于同名函
数而言)。
11、如果不能成功地分配所需要的内存时,new返回_0___。
12、在编译时将所用函数的代码嵌入到主调函数中,这种函数称为__内联函数______。 13、如果静态成员函数中要引用非静态成员时,可通过_对象____来引用。 14、当使用delete运算符释放一个对象时,delete会自动调用__析构函数_____。 15、从一个基类派生的继承为单继承,从多个基类派生的继承为___多继承____。 16、多继承下,可能造成对基类中某个成员访问的___二义性_____。
17、如果想要使公共基类在派生类中只产生一个基类子对象,则必须将这个基类设为__虚基类____。 18、面向对象程序设计的三大特征是封装性、继承性和___多态性_____。
2
19、多态从实现的角度来讲可以划分为两类,编译时的多态和___运行时的多态____。
20、将运算符++重载为类的友元函数时,定义前置++有_1___个参数,而定义后置++有_2__个参数。 21、抽象类不能实例化,即不能定义一个抽象类的___对象____。
22、关键字______、______、______ 和 _______在C++中用来建立新的数据类型。
23、定义在类内部的函数为____内联函数____,编译器会在调用该函数处,将函数代码的拷贝在调用函数处展开。 24、在类定义时如果没有定义构造函数,编译系统会自动生成一个___构造函数____。 25、类的___私有___成员只能被该类的成员函数或友元访问。 26、使关键字class定义的类中缺省的访问权限是___private_____。 27、一个类中只可能定义__1___个析构函数。
28、当一个类的成员是另一个类的对象时,该对象称为___子对象或对象成员____。 29、静态数据成员在定义或说明时前面要加上关键字___static____。 30、C++程序必须包含头文件____iostream.h_____后,才能使用输入输出流。 31、在说明const变量时,必须对该变量____初始化___。
32、在需要基类对象的任何地方都可以使用____派生类____的对象来代替。 33、带有纯虚函数的类是_抽象类_______。
34、动态联编可以通过__指针___或引用所标识的对象来操作虚函数。 35、_const____限定符用来声明只读变量。 36、公有成员函数的集合称为类的___接口____。
37、重载不能改变运算符的___优先级______和_____结合性__。 38、运算符____new__动态分配一个对象。
39、___重载______能够定义一个在不同数据类型基础上完成同一任务的函数。 40、每个对象都维护了一个指向自身的指针,这个指针称为___this___指针。
41、处于同一层次的各基类构造函数的执行顺序取决于___定义派生类_____所指定的各基类的顺序。 42、__构造函数_____是用来初始化类的数据成员的一种特殊的成员函数。 43、受保护的成员不能被外界引用,但它可以被派生类的___成员函数_____引用。 44、静态联编工作是在__编译______阶段完成的。
45、在C++中,对虚函数来说,不能声明___虚构造函数____,但可以声明虚析构函数 46、___静态___成员函数的实现中不能直接引用类中说明的非静态成员。 47、const char *p说明了p是指向___字符常量____的指针。
48、通常,类的成员函数的访问模式是__公有______,数据成员的访问模式是___私有____。
49、当用受保护的继承从基类派生一个类时,基类的公有成员成为派生类的__保护____成员,基类的受保护成员成为派生类的___保护____成员。
50、如果一个类包含一个或多个纯虚函数,则该类为___抽象类_____。 三、选择题
1、下列有关类的说法不正确的是__2/4______。 ① 类是一种用户自定义的数据类型;
② 只有类中的成员函数或友元函数才能存取类中的私有成员;
3
③ 在类中,如果不作特别说明,所有的数据均为私有类型; ④ 在类中,如果不作特别说明,所有的成员函数均为公有类型;
2、局部变量可以隐藏全局变量,那么在有同名全局变量和局部变量的情形时,可以用______1_提供对全局变量的访问。 ① 作用域运算符 ② 指针运算符 ③ 提取运算符 ④ 插入运算符
3、类模板的使用实际上是将类模板实例化成一个具体的____3____。 ① 函数 ② 对象 ③ 类 ④ 类的成员 4、下列输出字符‘d’的方法中,__1____是错误的。
① cout< ② 将a的地址值赋值给变量set; ③ a是类A的对象引用,用来作函数set( )的形参; ④ 变量A与a按位相与作为函数set( )的参数; 6、派生类的构造函数的成员初始化列表中,不能包含__3_____。 ① 基类的构造函数; ② 派生类中子对象的初始化; ③ 基类的子对象初始化; ④ 派生类中一般数据成员的初始化; 7、关于引用,下列的说法中错误的是____3___。 ① 引用是给被引用的变量取一个别名; ② 引用主要是用来作函数的形参和函数的返回值; ③ 在声明引用时,要给它另开辟内存单元; ④ 在声明引用时,必须同时使它初始化; 8、在下列说法中,_3_____不会调用拷贝初始化构造函数。 ① 当对象作为函数实参传递给函数形参时; ② 明确表示由一个对象初始化另一个对象时; ③ 用赋值运算符”=”将一个对象赋给另一个同类对象时; ④ 当对象作为函数返回值时; 9、___2__是不可以作为某类的成员的。 ① 自身类对象的指针 ② 自身类的对象 ③ 自身类对象的引用 ④ 另一个类的对象 10、关于虚函数的描述中,__3___是正确的。 ① 虚函数是一个static类型的成员函数; ② 虚函数是一个非成员函数; ③ 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数; 4 ④ 派生类的虚函数与基类的同名虚函数应具有不同的参数个数和类型; 11、下列四项选择中,_____3_不是流类的对象。 ① cin ② cout ③ buff ④ cerr 12、下列关于const限定符的说法中,错误的是_4_____。 ① const限定符是左结合的,即它修饰在它左边的类型; ② 在说明const变量时,必须对该变量进行初始化; ③ 与宏定义符号常量的区别是,const将产生一个具有类型的符号; ④ const变量是常量变量,所以一个const变量可以被多次赋予不同的常量; 13、在下列的各类函数中,___3___不是类的成员函数。 ① 构造函数 ② 析构函数 ③ 友元函数 ④ 拷贝初始化构造函数 14、__3___不是析构函数的特征。 ① 一个类中只能定义一个析构函数; ② 析构函数名与类名相同; ③ 析构函数只是用来释放对象,所以析构函数是空函数; ④ 析构函数不指定数据类型,并且也没有参数; 15、下述静态数据成员的特性中,____4__是错误的。 ① 说明静态数据成员时前面要加修饰符static; ② 静态数据成员要在类体外进行初始化; ③ 在程序中引用公有静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符; ④ 静态数据成员是个别对象所共用的; 16、具有转换函数功能的构造函数,应该是____2__。 ① 不带参数的构造函数; ② 带有一个参数的构造函数; ③ 带有两个以上参数的构造函数; ④ 缺省构造函数; 17、下列继承方式中,_3____种继承方式是错的。 ① 公有继承; ② 私有继承; ③ 完全继承; ④ 保护继承; 18、下列对继承关系的描述中,_____4_是对的。 ① 在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的; ② 在公有继承中,基类中只有公有成员对派生类的对象是可见的; ③ 在私有继承中,基类中只有公有成员对派生类是可见的; ④ 在私有继承中,基类中的保护成员对派生类的对象是可见的; 19、对定义重载函数的下列要求中,___4___是错误的。 ① 要求参数的个数不同; ② 要求参数中至少有一个类型不同; 5 ③ 要求参数个数相同时,参数类型不同; ④ 参数个数和类型相同时,要求函数的返回值不同; 20、当一个函数无返回值时,定义它时函数的类型应是_____1__。 ① void ② 任意 ③ int ④ 无 21、重载函数在调用时选择的依据中,错误的是_4_______。 ① 参数个数 ② 参数的类型 ③ 参数的位置 ④ 函数的返回值类型 22、有关构造函数的说法不正确的是____4___。 ① 构造函数的名字和类的名字一样; ② 构造函数在说明类的对象时自动执行; ③ 构造函数无任何函数类型; ④ 构造函数有且仅有一个; 23、下列的___4_是函数的引用调用。 ① 形参是指针,实参是地址值; ② 形参是变量,实参是引用; ③ 形参是指针,实参是数组名; ④ 形参是引用,实参是变量; 24、在一个被调用函数中,关于return语句使用的描述,___4__是错误的。 ① 被调用函数中可以不用return语句; ② 被调用函数中可以使用多个return语句; ③ 被调用函数中,如果有返回值,就一定要有return语句; ④ 被调用函数中,一个return语句可返回多个值给调用函数; 25、在C++中,关于下列设置参数默认值的描述中,__3____是正确的。 ① 不允许设置参数的默认值; ② 设置参数默认值只能在定义函数时设置; ③ 设置参数默认值时,应该是先设置右边的再设置左边的; ④ 设置参数默认值时,应该全部参数都设置; 26、关于new运算符的下列描述中,___4___是错误的。 ① 它可以用来动态创建对象和对象数组; ② 使用它创建的对象和对象数组可以使用运算符delete删除; ③ 使用它创建对象时要调用构造函数; ④ 使用它创建对象数组时必须指定初始值; 27、运算符*的功能是___3___。 ① 用来表示指向对象指针对指向类成员指针的操作; ② 用来表示对象对指向类成员指针的操作; ③ 用来表示指向对象指针对类成员的操作; ④ 用来表示对象对类成员的操作; 6 28、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用___1__合适。 ① 内联函数 ② 重载函数 ③ 递归函数 ④ 嵌套调用 29、采用函数重载的目的在于____4__。 ① 实现共享 ② 减少空间 ③ 提高速度 ④ 使用方便,提高可读性 30、下列函数中,___3__不能重载。 ① 成员函数 ② 非成员函数 ③ 析构函数 ④ 构造函数 31、在下列关键字中,用以说明类中公有成员的是_1____。 ① public ② private ③ protected ④ friend 32、有关类和对象的说法下列不正确的有_3______。 ① 对象是类的一个实例; ② 任何一个对象只能属于一个具体的类; ③ 一个类只能有一个对象; ④ 类与对象的关系和数据类型与变量的关系相似; 33、在下列关于标准输入流的描述中,正确的是_3_____。 ① 流提取运算符不能自动识别变量的类型,所以要用输入格式控制串; ② 变量和流提取运算符一起使用时,要象scanf函数那样在变量前加上&; ③ cin与流提取运算符”>>”一起,将从键盘输入的数送到变量中保存起来; ④ 使用标准输入流,必须包含头文件”stdlib.h”; 34、_3____是构造函数的特征。 ① 构造函数的函数名与类名不同; ② 一个类中只能定义一个构造函数; ③ 构造函数可以设置缺省参数; ④ 构造函数必须指定类型说明; 35、C++语言中规定函数的返回值的类型是由____4___。 ① return语句中的表达式类型所决定; ② 调用该函数的主调用函数类型决定; ③ 调用该函数时系统临时决定; ④ 在定义该函数时所指定的函数类型所决定; 36、下列对派生类的描述中,____2__是错的。 ① 一个派生类可以作为另一个派生类的基类; ② 派生类中继承的基类成员的访问权限到派生类保持不变; ③ 派生类的成员除了它自己的成员外,还包含了它的基类的成员; ④ 派生类至少有一个基类; 37、带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化 7 ___4__。 ① 与虚基类下面的派生类个数有关; ② 多次; ③ 二次; ④ 一次; 38、关于继承中出现的二义性的描述中,____3__是错的。 ① 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性; ② 解决二义性的最常用的方法是对成员名的限定法; ③ 在单继承情况下,派生类中对基类成员的访问也会出现二义性; ④ 一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性; 39、已知f1( )是类A的公有成员函数,p是指向成员函数f1( )的指针,采用___3__是正确的。 ① p=f1; ② p=A::f1; ③ p=A::f1( ); ④ p=f1( ); 40、关于动态联编的下列描述中,____4__是错误的。 ① 动态联编是以虚函数为基础的; ② 动态联编是在运行时确定所调用的函数代码的; ③ 动态联编调用函数操作是用指向对象的指针或对象引用; ④ 动态联编是在编译时确定操作函数的; 41、下面是面向对象程序设计的特点,而___3___不是的。 ① 多态性 ② 封装性 ③ 隐藏性 ④ 继承性 42、关于成员函数特征的下述描述中,___1__是错误的。 ① 成员函数一定是内联函数; ② 成员函数可以重载; ③ 成员函数可以设置参数的缺省值; ④ 成员函数可以是静态的。 43、关于delete运算符的下列描述中,____3_是错的。 ① 它必须用于new返回的指针; ② 它也适用于空指针; ③ 对一个指针可以使用多次该运算符; ④ 指针名前只用一对方括号,不管所删除数组的维数。 44、设置虚基类的目的是____2_。 ① 简化程序; ② 消除二义性; ③ 提高运行效率; ④ 减少目标代码; 45、下列运算符中,____1_运算符在C++中不能重载。 ① ?: ② + ③ new ④ <= 46、下列关于运算符重载的描述中,4_____是正确的。 ① 运算符重载可以改变运算数的个数; ② 运算符重载可以改变优先级; 8 ③ 运算符重载可以改变结合性; ④ 运算符重载不可以改变语法结构; 47、如果一个类至少有一个纯虚函数,那么就称该类为____1_。 ① 抽象类 ② 虚基类 ③ 派生类 ④ 以上都不对 48、对基类和派生类的关系描述中,_2____是错误的。 ① 派生类是基类的具体化; ② 派生类是基类的子集; ③ 派生类是基类定义的延续; ④ 派生类是基类的组合; 49、已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,___1_是正确的。 ① void print( ) const ② const void print( ) ③ void const print( ) ④ void print(const) 50、派生类的对象对它的基类成员中,__1___是可以访问的。 ① 公有继承的公有成员; ② 公有继承的私有成员; ③ 公有继承的保护成员; ④ 私有继承的公有成员。 四、简答题 1、 什么叫做静态成员函数?它有何特点? 2、在继承体制中,试分析基类中某成员函数是虚函数与不是虚函数有何不同? 3、试解释纯虚函数与函数体为空的虚函数的相似及不同之处。 4、为什么说C++中的运算符<<和>>是重载的运算符? 5、什么是动态联编?在什么情况下可以实现动态联编? 6、拷贝初始化构造函数是一特殊的成员函数,在什么情况下系统会自动调用它? 7、多继承下,可能造成对基类中某个成员访问的不唯一性,称为对基类成员访问的二义性问题。试举例说明,多继承时,在什么情况下会产生二义性? 8、如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生多少个相应的静态变量? 9、派生类的对象可以赋给基类对象,反过来行吗?为什么? 10、构造函数可以是虚函数吗?试说明。 五、写出下列程序的运行结果 1、 #include \"iostream.h\" class A { public: A(int i=0) { m=i; cout<<\"Constructor called.\"< 9 void print( ) const { cout< int m; }; void fun(const A &c) { c.print( ); } void main( ) { fun(5); } 答案:Constructor called. 5 5 deconstructor called 1 修饰参数的const,如 void fun0(const a* a ); void fun1(const a& a); 调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const a* a,则不 能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const a& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。 [注意]:参数const通常用于参数为指针或引用的情况; 2 修饰返回值的const,如const a fun2( ); const a* fun3( ); 这样声明了返回值后,const按照\"修饰原则\"进行修饰,起到相应的保护作用。 一般用const修饰返回值为对象本身的情况多用于二目操作符重载函数并产生新对象的时候。 [总结] 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函 数的返回值类型为某个对象或对 某个对象引用的情况。 3 类成员函数中const的使用 一般放在函数体后,形如:void fun() const; 如果一个成员函数的不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改, 编译器将报错,这大大提高了程序的健壮性。 2、 #include \"iostream.h\" class A { public: A( ) { a=0; b=0; cout<<\"Default constructor called.\"< cout<<\"Constructor: a=\"<10 } ~A( ) { cout<<\"Destructor called.\"< void main( ) { A a[3]; for(int i=0; i<3; i++) { a[i].set(2*i+1,(i+1)*2); a[i].print( ); } } 答案: default constructor called default constructor called default constructor called a=1,b=2 a=3,b=4 a=5,b=6 deconstructor called deconstructor called deconstructor called 3、 #include \"iostream.h\" class B { public: B( ) { } B(int i,int j) { a=i, b=j; } void printb( ); private: int a,b; }; class A { public: A( ) { } 11 A(int i, int j):c(i,j) { } void printa( ); private: B c; }; void B::printb( ) { cout<<\"a=\"<ob.printa( ); } 答案: a=7,b=8 4、 #include \"iostream.h\" class A { public: A(int i,int j) { x=i; y=j; } friend int fun(A &a); private: int x, y; }; int fun(A &a) { a.x=a.x*a.y; return a.x; } void main( ) { A ob1(4,7),ob2(5,9); cout< 答案: 28,45 例题:如果需要将目标类(Time)中的成员函数(call)声明为本类(Date)的友元函数,则需要在本类的函数声分声明该函数为friend。此时,该函数可以访问本类的private成员。 class Date; //对Date类的提前引用声明 class Time{ public: 12 明部Time(int=1,int=1,int=1); void call(Date &);//声明成员函数 private: int hour; int min; int sec; }; Class Date{ public: Date(int=1,int=1,int=2008); friend void Time::call(Date&); //声明Time类的call为本类的友元成员函数 private: int year; int mon; int day; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } void Time::call(Date &d) { cout<<\"TIME:\"< int main(){ Time t; Date d; t.call(d); system(\"PAUSE\"); return EXIT_SUCCESS; } 13 5、 #include \"iostream.h\" class A { public: A(int i, int j) { a=i; b=j; } void move(int i, int j) { a+=i; b+=j; } void disp( )