1、1面向对象程序设计期末综合练习一(单选题)单选题1. C+源程序文件的缺省扩展名为( A )。A. cpp B. exe C. obj D. lik2. 由 C+源程序文件编译而成的目标文件的缺省扩展名为( C )。A. cpp B. exe C. obj D. lik3. 由 C+目标文件连接而成的可执行文件的缺省扩展名为( B )。A. cpp B. exe C. obj D. lik4. 编写 C+程序一般需经过的几个步骤依次是( B )。A. 编译、编辑、连接、调试B. 编辑、编译、连接、调试C. 编译、调试、编辑、连接D. 编辑、调试、编辑、连接5. 以下说法中正确的是( B ) 。
2、 A. C+程序总是从第一个定义的函数开始执行B. C+程序总是从 main 函数开始执行C. C+函数必须有返回值,否则不能使用函数D. C+程序中有调用关系的所有函数必须放在同一个程序文件中6. 以下叙述中不正确的是( C ) 。A. 在一个函数中,可以有多条 return 语句B. 函数的定义不能嵌套,但函数的调用可以嵌套C. 函数必须有返回值D. 不同的函数中可以使用相同名字的变量7. 当#include 后面的文件名用双引号括起来时,寻找被包含文件的方式是( B )。A. 直接按系统设定的标准方式搜索目录B. 先在源程序所在目录搜索,再按系统设定的标准方式搜索目录C. 仅仅搜索源程序
3、所在目录D. 搜索当前逻辑盘上的所有目录8. 当#include 后面的文件名用尖括号括起来时,寻找被包含文件的方式是( A )。A. 直接按系统设定的标准方式搜索目录B. 先在源程序所在目录搜索,再按系统设定的标准方式搜索目录C. 仅仅搜索源程序所在目录D. 搜索当前逻辑盘上的所有目录9. 预处理命令在程序中都是以( B )符号开头的。A. * B. # C. B. int *p=new float10;C. int *p=new int10; D. int *p=new int10=1,2,3,4,511.假定变量 m 定义为“int m=7;” ,则定义变量 p 的正确语句为(B ) 。
4、A. int p= B. int *p= C. int D. int *p=m;212.假定 k 是一个 double 类型的变量,则关于变量 p 的正确定义语句为( D ) 。A. double p= B. int *p= C. double D. char *p=”Thank you!”;13.假定 p 指向的字符串为”string” ,若要输出这个字符串的地址值,则使用( D ) 。A. couta D. x.a34.假定 AA 为一个类,a()为该类公有的函数成员,x 为该类的一个对象,则访问 x 对象中函数成员 a()的格式为( B ) 。A. x.a B. x.a() C. x-a
5、 D. x-a()35.假定 AA 为一个类,a 为该类公有的数据成员,px 为指向该类对象的一个指针,则访问 px所指对象中数据成员 a 的格式为( C ) 。A. px(a) B. pxa C. px-a D. px.a36.假定 AA 为一个类,a 为该类私有的数据成员,GetValue()为该类公有函数成员,它返回 a的值,x 为该类的一个对象,则访问 x 对象中数据成员 a 的格式为( D ) 。A. x.a B. x.a() C. x-GetValue() D. x.GetValue()37.假定 AA 为一个类,int a()为该类的一个成员函数,若该成员函数在类定义体外定义,则
6、函数头为( A ) 。A. int AA:a() B. int AA:a() C. AA:a() D. AA:int a()38.假定 AA 为一个类,a 为该类公有的数据成员,若要在该类的一个成员函数中访问它,则书写格式为( A ) 。A. a B. AA:a C. a() D. AA:a()39.若需要把一个类外定义的成员函数指明为内联函数,则必须把关键字( B )放在函数原型或函数头的前面。A. in B. inline C. inLine D. InLiner40.在多文件结构的程序中,通常把类的定义单独存放于( D )中。A. 主文件 B. 实现文件 C. 库文件 D. 头文件441
7、.在多文件结构的程序中,通常把类中所有非内联函数的定义单独存放于( B )中。A. 主文件 B. 实现文件 C. 库文件 D. 头文件42.在多文件结构的程序中,通常把含有 main()函数的文件称为( A ) 。A. 主文件 B. 实现文件 C. 程序文件 D. 头文件43.一个 C+程序文件的扩展名为( C ) 。A. .h B. .c C. .cpp D. .cp44.在 C+程序中使用的 cin 标识符是系统类库中定义的( A )类中的一个对象。A. istream B. ostream C. iostream D. fstream45.在 C+程序中使用的 cout 标识符是系统类库
8、中定义的( B )类中的一个对象。A. istream B. ostream C. iostream D. fstream46.假定 AA 是一个类,abc 是该类的一个成员函数,则参数表中隐含的第一个参数的类型为( D ) 。A. int B. char C. AA D. AA*47.假定 AA 是一个类,abc 是该类的一个成员函数,则参数表中隐含的第一个参数为( C ) 。A. abc B. *this C. this D. this”是该类中一个成员函数的原型,若该函数存在对*this赋值的语句,当用 x.abc()调用该成员函数后,x 的值( A ) 。A. 已经被改变 B. 可能被
9、改变 C. 不变 D.不受函数调用的影响49.假定 AA 是一个类, “AA* abc()const;”是该类中一个成员函数的原型,若该函数返回this 值,当用 x.abc()调用该成员函数后,x 的值( C ) 。A. 已经被改变 B. 可能被改变C. 不变 D. 受到函数调用的影响50.类中定义的成员默认为( B )访问属性。A. public B. private C. protected D. friend51.结构中定义的成员默认为( A )访问属性。A. public B. private C. protected D. friend52.当类中一个字符指针成员指向具有 n 个字
10、节的存储空间时,它所能存储字符串的最大长度为( C )。A. n B. n+1 C. n-1 D. n-253.在一个用链表实现的队列类中,假定每个结点包含的值域用 elem 表示,包含的指针域用next 表示,链队的队首指针用 elemHead 表示,队尾指针用 elemTail 表示,若链队非空,则进行插入时必须把新结点的地址赋给( D )。A. elemHead B. elemTailC. elemHead-next 和 elemHead D. elemTail-next 和 elemTail54.在一个用链表实现的队列类中,假定每个结点包含的值域用 elem 表示,包含的指针域用nex
11、t 表示,链队的队首指针用 elemHead 表示,队尾指针用 elemTail 表示,若链队为空,则进行插入时必须把新结点的地址赋给( C )。A. elemHead B. elemTailC. elemHead 和 elemTail D. elemHead 或 elemTail55.队列具有( A )的操作特性。A. 先进先出 B. 先进后出 C. 进出无序 D. 进出任意556.栈具有( B )的操作特性。A. 先进先出 B. 先进后出 C. 进出无序 D. 进出任意57.对于一个类的构造函数,其函数名与类名( A )。A. 完全相同 B. 基本相同 C. 不相同 D. 无关系58.对于
12、一个类的析构函数,其函数名与类名( C )。A. 完全相同 B. 完全不同 C. 只相差一个字符 D. 无关系59.类的构造函数是在定义该类的一个( C )时被自动调用执行的。A. 成员函数 B. 数据成员 C. 对象 D. 友元函数60.类的析构函数是一个对象被( B )时自动调用的。A. 建立 B. 撤消 C. 赋值 D. 引用61.一个类的构造函数通常被定义为该类的( A )成员。A. 公用 B. 保护 C. 私有 D. 友元62.一个类的析构函数通常被定义为该类的( C )成员。A. 私有 B. 保护 C. 公用 D. 友元63.假定 AB 为一个类,则执行 “AB x;”语句时将自动
13、调用该类的( B )。A. 带参构造函数 B. 无参构造函数 C. 拷贝构造函数 D. 赋值重载函数64.假定 AB 为一个类,则执行 “AB x(a,5);”语句时将自动调用该类的( A )。A. 带参构造函数 B. 无参构造函数 C. 拷贝构造函数 D. 赋值重载函数65.假定 AB 为一个类,则执行 “AB *s=new AB(a,5);”语句时得到的一个动态对象为( D )。A. s B. s-a C. s.a D. *s66.假定 AB 为一个类,则执行 “AB r1=r2;”语句时将自动调用该类的( D )。A. 无参构造函数 B. 带参构造函数 C. 赋值重载函数 D. 拷贝构造
14、函数67.若需要使类中的一个指针成员指向一块动态存储空间,则通常在( B )函数中完成。A. 析构 B. 构造 C. 任一成员 D. 友元68.当类中的一个整型指针成员指向一块具有 n*sizeof(int)大小的存储空间时,它最多能够存储( A )个整数。A. n B. n+1 C. n-1 D. 169.假定一个类的构造函数为 “A(int aa, int bb) a=aa; b=aa*bb;”,则执行 “A x(4,5);”语句后,x.a 和 x.b 的值分别为( C )。A. 4 和 5 B. 5 和 4 C. 4 和 20 D. 20 和 570.假定一个类的构造函数为 “A(int
15、 aa=1, int bb=0) a=aa; b=bb;”,则执行 “A x(4);”语句后,x.a 和 x.b 的值分别为( D )。A. 1 和 0 B. 1 和 4 C. 4 和 1 D. 4 和 071.假定 AB 为一个类,则( B )为该类的拷贝构造函数的原型说明。A. AB(AB x); B. AB(AB C. void AB(AB D. AB(int x);72.假定一个类的构造函数为 “B(int ax, int bx): a(ax), b(bx) ”,执行 “B x(1,2),y(3,4);x=y;”语句序列后 x.a 的值为( C )。A. 1 B. 2 C. 3 D.
16、473.假定一个类 AB 只含有一个整型数据成员 a,当用户不定义任何构造函数时,系统为该类定义的无参构造函数为( D )。A. AB() a=0; B. AB(int aa=0): a(aa) 6C. AB(int aa): a(aa) D. AB() 74.假定一个类 AB 只含有一个整型数据成员 a,用户为该类定义的带参构造函数可以为( C )。A. AB() B. AB(): a(0)C. AB(int aa=0) a=aa; D. AB(int aa) 75.对于任一个类,用户所能定义的构造函数的个数至多为( D )。A. 0 B. 1 C. 2 D. 任意个76.对于任一个类,用户
17、所能定义的析构函数的个数至多为( B )。A. 0 B. 1 C. 2 D. 任意个77.假定 AB 为一个类,则执行 “AB *px=new ABn;”语句时将( A )。A. 动态分配一个数组 B. 动态分配一个对象C. 静态分配一个数组 D. 静态分配一个对象78.设 px 是指向一个类对象的指针变量,则执行 “delete px;”语句时,将自动调用该类的( C )。A. 无参构造函数 B. 带参构造函数 C. 析构函数 D. 拷贝构造函数79.当一个类对象离开它的作用域时,系统自动调用该类的( D )。A. 无参构造函数 B. 带参构造函数 C. 拷贝构造函数 D. 析构函数80.假
18、定一个类对象数组为 An,当离开它定义的作用域时,系统自动调用该类析构函数的次数为( C )。A. 0 B. 1 C. n D. n-181.假定 AB 为一个类,则执行 “AB a10;”语句时调用该类无参构造函数的次数为( D )。A. 0 B. 1 C. 9 D. 10 82.假定 AB 为一个类,则执行 “AB *px=new ABn;”语句时调用该类无参构造函数的次数为( A )。A. n B. n-1 C. 1 D. 083.假定 AB 为一个类,则执行 “AB a, b(3), *p;”语句时共调用该类构造函数的次数为( A )。A. 2 B. 3 C. 4 D. 584.假定
19、AB 为一个类,则执行 “AB a(2), b3, *p4;”语句时共调用该类构造函数的次数为( B )。A. 3 B. 4 C. 5 D. 985.假定 AB 为一个类,则执行“AB a, b(2), c3, *p=”语句时共调用该类无参构造函数的次数为( D )。A. 5 B. 6 C. 3 D. 486.假定 AB 为一个类,则执行“AB *p=new AB(1,2);”语句时共调用该类构造函数的次数为( B )。A. 0 B. 1 C. 2 D. 387.假定 AB 为一个类,px 为指向该类的一个含有 n 个对象的动态数组的指针,则执行“delete px;”语句时共调用该类析构函数
20、的次数为( C )。A. 0 B. 1 C. n D. n+188.对类对象成员的初始化是通过构造函数中给出的( B )实现的。A. 函数体 B. 初始化表 C. 参数表 D. 初始化表或函数体789.对类中常量成员的初始化是通过构造函数中给出的( C )实现的。A. 函数体 B. 参数表 C. 初始化表 D. 初始化表或函数体90.对类中引用成员的初始化是通过构造函数中给出的( C )实现的。A. 函数体 B. 参数表 C. 初始化表 D. 初始化表或函数体91.类的构造函数可以带有( D )个参数。A. 0 B. 1 C. 2 D. 任意92.类的析构函数可以带有( A )个参数。A. 0
21、 B. 1 C. 2 D. 任意93.一个类的静态数据成员所表示属性 ( C )。A. 是类的或对象的属性 B. 只是对象的属性C. 只是类的属性 D. 类和友元的属性 94.类的静态成员的访问控制( D ) 。A. 只允许被定义为 privateB. 只允许被定义为 private 或 protected C. 只允许被定义为 public D. 可允许被定义为 private、protected 或 public95.静态成员函数对类的数据成员访问( B ) 。A. 是不允许的 B. 只允许是静态数据成员 C. 只允许是非静态数据成员 D. 可允许是静态数据成员或非静态数据成员96.被非静
22、态成员函数访问的类的数据成员( A )。A. 可以是非静态数据成员或静态数据成员 B. 不可能是类的静态数据成员C. 只能是类的非静态数据成员 D. 只能是类的静态数据成员97.静态数据成员的初始化是在( D )中进行的。A. 构造函数 B. 任何成员函数C. 所属类 D. 全局区98.当将一个类 A 或函数 f()说明为另一个类 B 的友元后,类 A 或函数 f()能够直接访问类 B的( D ) 。A. 只能是公有成员 B. 只能是保护成员 C. 只能是除私有成员之外的任何成员 D. 具有任何权限的成员99.引入友元的主要目的是为了( C ) 。A. 增强数据安全性 B. 提高程序的可靠性C
23、. 提高程序的效率和灵活性 D. 保证类的封装性100. 一个类的成员函数也可以成为另一个类的友元函数,这时的友元说明( A ) 。A. 需加上类域的限定 B. 不需加上类域的限定C. 类域的限定可加可不加 D. 不需要任何限定101. 一个类的友元不是该类的成员,与该类的关系密切,所以它( D ) 。A. 有 this 指针,有默认操作的对象 B. 没有 this 指针,可以有默认操作的对象C. 有 this 指针,不能执行默认操作D. 没有 this 指针,也就没有默认操作的对象102. 在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是( B ) 。A. 作为友元函数重载的 1
24、 元运算符 B. 作为成员函数重载的 1 元运算符8C. 作为友元函数重载的 2 元运算符 D. 作为成员函数重载的 2 元运算符103. 在成员函数中进行双目运算符重载时,其参数表中应带有( B )个参数。A. 0 B. 1 C. 2 D. 3104. 双目运算符重载为普通函数时,其参数表中应带有( C )个参数。A. 0 B. 1 C. 2 D. 3105. 如果表达式 a+b 中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为( A ) 。A. a.operator+(b) B. b.operator+(a)C. operator+(a,b) D. operato
25、r(a+b)106. 如果表达式 a=b 中的“=”是作为普通函数重载的运算符,若采用运算符函数调用格式,则可表示为( C ) 。A. a.operator=(b) B. b.operator=(a)C. operator=(a,b) D. operator=(b,a)107. 如果表达式 a+中的“+”是作为普通函数重载的运算符,若采用运算符函数调用格式,则可表示为( C ) 。A. a.operator+() B. operator+(a)C. operator+(a,1) D. operator+(1,a)108. 如果表达式+a 中的“+”是作为成员函数重载的运算符,若采用运算符函数调
26、用格式,则可表示为( D ) 。A. a.operator+(1) B. operator+(a)C. operator+(a,1) D. a.operator+()109. 关于运算符重载,下列说法正确的是( C ) 。A. 重载时,运算符的优先级可以改变。B. 重载时,运算符的结合性可以改变。C. 重载时,运算符的功能可以改变。D. 重载时,运算符的操作数个数可以改变。110. 关于运算符重载,下列说法正确的是( B ) 。A. 所有的运算符都可以重载。B. 通过重载,可以使运算符应用于自定义的数据类型。C. 通过重载,可以创造原来没有的运算符。D. 通过重载,可以改变运算符的优先级。11
27、1. 一个程序中数组 a 和变量 k 定义为“int a510,k;”,且程序中包含有语句“a(2,5)=+k*3;”,则此语句中肯定属于重载操作符的是( A ) 。A. ( ) B. = C. + D. *112. 假定 K 是一个类名,并有定义“K k; int j;”,已知 K 中重载了操作符 ( ),且语句“j=k(3);”和“k(5)=99;”都能顺利执行,说明该操作符函数的原形只可能是( C ) 。A. K operator ( ) (int); B. int operator ( )(intC. int D. K 113. 假定 M 是一个类名,且 M 中重载了操作符=,可以实现
28、 M 对象间的连续赋值,如“m1=m2=m3;”。重载操作符=的函数原型最好是( D ) 。A. int operaotor=(M); B. int operator=(M9C. M operator=(M D. M114. 下面是重载双目运算符+的普通函数原形,其中最符合+原来含义的是( A ) 。A. Value operator+(Value, Value); B. Value operator+(Value,int);C. Value D. Value 115. 下面是重载双目运算符-的成员函数原形,其中最符合-原来含义的是( A ) 。A. Value Value:operator-
29、(Value); B. Value Value:operator-(int);C. Value D. Value 116. 在重载一运算符时,若运算符函数的形参表中没有参数,则不可能的情况是( D ) 。A. 该运算符是一个单目运算符。 B. 该运算符函数有一个隐含的参数 this。C. 该运算符函数是类的成员函数。D. 该运算符函数是类的友元函数。117. 关于插入运算符的重载,下列说法不正确的是( B ) 。A. 运算符函数的返回值类型是 ostream & 。B. 重载的运算符必须定义为类的成员函数。C. 运算符函数的第一个参数的类型是 ostream & 。D. 运算符函数有两个参数。
30、118. 从一个基类派生出的各个类的对象之间( C )。A. 共享所有数据成员,每个对象还包含基类的所有属性B. 共享部分数据成员,每个对象还包含基类的所有属性C. 不共享任何数据成员,但每个对象还包含基类的所有属性D. 共享部分数据成员和函数成员119. 如果是类 B 在类 A 的基础上构造,那么,就称( B ) 。A. 类 A 为基类或父类,类 B 为超类或子类B. 类 A 为基类、父类或超类,类 B 为派生类或子类 C. 类 A 为派生类,类 B 为基类D. 类 A 为派生类或子类,类 B 为基类、父类或超类120. C+的继承性允许派生类继承基类的( C ) 。A. 部分特性,并允许增
31、加新的特性或重定义基类的特性B. 部分特性,但不允许增加新的特性或重定义基类的特性 C. 所有特性,并允许增加新的特性或重定义基类的特性D. 所有特性,但不允许增加新的特性或重定义基类的特性121. 派生类的成员函数可以直接访问基类的( B )成员。A. 所有 B. 公有和保护 C. 保护和私有 D. 私有122. 对于公有继承,基类的公有和保护成员在派生类中将( D )成员。A. 全部变成公有 B. 全部变成保护 C. 全部变成私有 D. 仍然相应保持为公有和保护123. 对于公有继承,基类中的私有成员在派生类中将 ( C )。A. 能够直接使用成员名访问 B. 能够通过成员运算符访问10C
32、. 仍然是基类的私有成员 D. 变为派生类的私有成员124. 当保护继承时,基类的( B )在派生类中成为保护成员,在类作用域外不能够通过派生类的对象来直接访问该成员。A. 任何成员 B.公有成员和保护成员 C. 保护成员和私有成员 D.私有成员125. 在定义一个派生类时,若不使用保留字显式地规定采用何种继承方式,则默认为( A )方式。A. 私有继承 B. 非私有继承C. 保护继承 D. 公有继承126. 建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为( C )的构造函数。A. 自己所属类、对象成员所属类、基类B. 对象成员所属类、基类、自己所属类C. 基类、对象成员
33、所属类、自己所属类D. 基类、自己所属类、对象成员所属类127. 当派生类中有和基类一样名字的成员时,一般来说, ( B ) 。A. 将产生二义性 B. 派生类的同名成员将覆盖基类的成员C. 是不能允许的 D. 基类的同名成员将覆盖派生类的成员128. C+中的虚基类机制可以保证:( D ) 。A. 限定基类只通过一条路径派生出派生类B. 允许基类通过多条路径派生出派生类,派生类也就能多次继承该基类C. 当一个类多次间接从基类派生以后,派生类对象能保留多份间接基类的成员D. 当一个类多次间接从基类派生以后,其基类只被一次继承129. 下列对派生类的描述中错误的说法是:( D ) 。A. 派生类至少有一个基类B. 派生类可作为另一个派生类的基类C. 派生类除了包含它直接定义的成员外,还包含其基类的成员D. 派生类所继承的基类成员的访问权限保持不变130. 派生类的对象对其基类中( C )可直接访问。A. 公有继承的公有成员B. 公有继承的私有成员C. 公有继承的保护成员D. 私有继承的公有成员