第九章 运算符重载
一、选择题
1. 不能重载的运算符是( )
A. && B. [] C. :: D. new
2. 下列关于运算符重载的描述中,正确的是( )
A. 运算符重载可以改变操作数的个数 B. 运算符重载可以改变优先级
C. 运算符重载可以改变结合性 D. 运算符重载不可以改变语法结构
3. 友元运算符表达式obj1>obj2被C++编译器解释为( )
A. operator>(obj1,obj2) B. >(obj1,obj2)
C. obj2.operator>(obj1) D. obj1.operator>(obj2)
4. 下列关于C++运算符函数的返回类型的描述中,错误的是( )
A. 可以是类类型 B. 可以是int类型
C. 可以是void类型 D. 可以是float类型
5. 不能重载的运算符是( )
A. new B. -> C. * D. .*
6. 下列关于运算符重载的描述中错误的是( )
A. 能被重载的运算符一定可以重载为成员函数
B. 能被重载的运算符一定可以重载为友元函数
C. 运算符重载时不能改变语法结构
D. 通过运算符重载可以适应用户自定义类型的运算
7. 在一个类中可以对一个操作符进行( )重载。
A. 1种 B. 2种以下 C. 3种以下 D. 多种
二、填空题
1. 对运算符进行重载时,不能改变运算符的优先级,不能 改变运算符的结合性,不能 改变运算所需要的操作数数目。
2. 运算符被重载为类的成员函数时不能被该类的派生类继承。=(赋值)
3. 当++被重载为后置成员函数时需要1 个参数。
4. 当++被重载为前置成员函数时需要 0 个参数。
5. 在C++中,运算符只能被重载为 类的成员函数 和 类的友元。
一、选择题
1. 下列各选项组中,都是C++语言关键字的组是( )
A. cout, operator, this B. short, string, static
C. if, while, >= D. private, public, printf
2. 下列关于友元的说法中不正确的是( )
A. 友元破坏了类的封装性和信息隐藏性
B. 友元类的所有成员函数都可以直接访问类的成员
C. 友元关系不能传递
D. 友元关系是单向的
3.( )不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开
放的接口。
A. 公有成员 B. 私有成员 C. 友元 D. 保护成员
4. 下列关于对象数组的说法中错误的是( )
A. 对象数组元素的下标从0开始
B. 可以将对象数组的类类型的基类对象赋给对象数组的元素
C. 对对象数组元素的赋值也必须遵守类型适应性原则
D. 对象数组的每个元素是同一个类的对象
5. 在多继承的构造函数定义中,几个基类的构造函数之间用( )分隔。
A. ; B. : C. , D.::
6. 下列对派生类的描述中,错误的是( )
A. 一个派生类可以作另一个派生类的基类
B. 派生类至少有一个基类
C. 派生类的成员除了它自己的成员外,还包含了它的基类的成员
D. 派生类中继承的基类成员的访问权限到派生类保持不变
7. 关于多继承二义性的描述中,错误的是( )
A. 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义
性
B. 解决二义性的最常用的方法是对成员名的限定法
C. 基类和派生类中同时出现的同名函数,也存在二义性问题
D. —个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进
行访问时,也可能出现二义性
8. 在一个类中可以对一个操作符进行( )重载。
A. 1种 B. 2种以下 C. 3种以下 D. 多种
9. 下列对构造函数的描述中错误的是( )
A. 构造函数负责对对象及其子对象进行初始化
B. 子对象的初始化顺序由构造函数的初始化列表的顺序决定
C. 含义一个参数的构造函数具有数据类型转换功能
D. 构造函数中不能对静态数据成员初始化
10. 派生类对象可访问的基类成员是( )
A. 公用继承的公用成员 B. 公用继承的私有成员
C. 公用继承的保护成员 D. 私有继承的公用成员
11有关继承的叙述中,正确的是( )
A. 构造函数和析构函数都能被继承
B. 派生类是基类的组合
C. 派生类对象除了能访问自己的成员外,不能访问基类中的所有成员
D. 基类的公用成员一定能被派生类的对象访问
12. 关于模板和继承的叙述中,正确的是( )
A. 模板和继承都可以派生出一个类系
B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定
C. 从动态性能看,继承类系比模板类系具有更多的动态特性
D. 相同类模板的不同实例一般有联系
13. 在私有继承的情况下,基类成员在派生类中的访问权限( )
A. 受限制 B. 保持不变 C. 受保护 D. 不受保护
14. 对基类和派生类关系的描述中,不正确的是( )
A. 派生类是基类的具体化 B. 派生类是基类的子集
C. 派生类是基类定义的延续 D. 派生类是基类的组合
15. 可以用p.a的形式访问派生类对象p的基类成员a,其中a是( )
A. 私有继承的公用成员 B. 公用继承的私有成员
C. 公用继承的保护成员 D. 公用继承的公用成员
16. 关于公用派生情况下派生类与基类及其对象间的关系叙述中,错误的是( )
A. 派生类的对象可以赋给基类的对象
B. 派生类的对象可以初始化基类的引用
C. 派生类的对象可以直接访问基类中的成员
D. 派生类的对象的地址可以赋给指向基类的指针
17. 继承机制的作用是( )
A. 信息隐藏 B. 数据封装 C. 定义新类 D. 数据抽象
18. 已知B类是A类的派生类,且有定义:A a, *p1; B b, *p2=&b;,则下列选项中属于非法
操作的是( )
A. b=a; B. p1=&b; C. A &a2=b; D. p1=p2;
19. 在派生类中能直接访问基类的( )
A. 公用成员和私有成员 B. 保护成员和私有成员
C. 只能访问公用成员 D. 公用成员和保护成员
20. 基类的保护成员在公用派生类中是( )
A. 保护成员 B. 公用成员 C. 私有成员 D. 非法成员
21. 假设类X以类Y作为它的一个基类,并且X类和Y类具有相同格式的函数func(),obj为类
X的对象,则obj.func()语句实现的功能为( )
A. 先执行类X的func(),再执行类Y的func()
B. 先执行类Y的func(),再执行类X的func()
C. 执行类X的func()
D. 执行类Y的func()
22. 基类中的保护成员在公用派生类中的成员属性是( )
A. private B. protected C. public D. static
23. 建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为( )
A. 自己所属类、对象成员所属类、基类的构造函数
B. 对象成员所属类、基类、自己所属类的构造函数
C. 基类、对象成员所属类、自己所属类的构造函数
D. 基类、自己所属类、对象成员所属类的构造函数
24. 派生类的构造函数的成员初始化列表中,不能包含( )
A. 基类的构造函数 B. 派生类中子对象的初始化
C. 基类的子对象初始化 D. 派生类中一般数据成员的初始化
25. 继承具有( ),即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接
基类的成员。
A. 传递性 B. 规律性 C. 多样性 D. 重复性
26. C++类体系中,能被派生类继承的是( )
A. 构造函数 B. 虚函数 C. 静态成员函数 D. 赋值操作函数
27. 关于子类型的描述中,错误的是( )
A. 子类型就是指派生类是基类的子类型
B. 一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型
C. 在公有继承下,派生类是基类的子类型
D. 子类型关系是不可逆的
28. 下列关于子类型的描述中,错误的是( )
A. 子类型关系是可逆的
B. 公有派生类的对象可以初始化基类的引用
C. 只有在公有继承下,派生类是基类的子类型
D. 子类型关系是可传递的
29. 不符合赋值兼容规则(类型兼容规则) 的是( )
A. 派生类的对象可以赋值给基类的对象
B. 基类的对象可以赋值给派生类的对象
C. 派生类的对象可以初始化基类的引用
D. 派生类的对象的地址可以赋值给指向基类的指针
30. 在派生类对基类继承的传递性中,错误的是( )
A. 在公有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的
私有数据成员
B. 在公有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的
私有数据成员
C. 在私有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的
私有数据成员
D. 不管是私有继承还是公有继承,基类的私有成员在派生类的作用域内都是不可见的
31. 下列说法中正确的是( )
A. 派生类可以定义自己的成员函数
B. 从基类派生的派生类不能再作为其它派生类的基类
C. 基类中的成员都可以被其派生类继承
D. 派生类的继承方式有:公有继承和私有继承
32. 派生类对它的基类成员中不可访问的是( )
A. 公有继承的公有成员 B. 私有继承的公有成员
C. 私有继承的私有成员 D. 保护继承的保护成员
33. 在公有继承中,基类中的( )对派生类对象是可见的。
A. 私有成员 B. 保护成员 C. 公有成员 D. 以上都不可见
34. 派生类将其本身与基类区别开来的方法是( )
A. 添加新成员 B. 使用公共继承 C. 使用虚基类 D. 使用多继承
35. 下列关于子类型的说法中不正确的是( )
A. 子类型关系是不可逆的 B. 子类型关系是不对称的
C. 子类型化与类型适应性是一致的 D. 继承实现了子类型化
36. 下列关于继承的说法中错误的是( )
A. 默认的继承方式是私有继承
B. 不能被继承的基类成员在派生类中都不存在
C. 在继承图中,有向线是从派生类指向基类
D. 派生类通过增加新成员来与基类相区别
37. 下列关于赋值兼容性规则的描述中,错误的是( )
A. 不要求派生类的派生方式
B. 派生类的对象可以赋给基类对象
C. 派生类的对象可以初始化基类的引用
D. 派生类的对象的地址可以赋给基类类型的指针
38. 基类的( )在派生类中的性质与继承的性质一样。
A. 公有成员 B. 私有成员 C. 受保护成员 D. 私有成员函数
39. 基类的( )在私有继承时在派生类中成为私有成员,在公有和受保护继承时在派生类中
仍然为受保护成员。
A. 公有成员 B. 私有成员 C. 受保护成员 D. 私有成员函数
40. 下列叙述中错误的是( )
A. 派生类可以使用private派生
B. 对基类成员的访问必须是无二义性的
C. 基类成员的访问能力在派生类中保持不变
D. 赋值兼容性规则也适用于多继承
二、填空题
1. 在类继承中,默认的继承方式是 private。
2. 对于派生类的构造函数,在定义对象时构造函数的调用顺序为:先执行 基类的构造函数、再执行 子对象的构造函数,最后执行 派生类本身的构造函数。
3. 导出类或导出类的导出类对基类的访问称为 垂直 访问 。
4. 导出类的对象对基类成员的访问称为 水平 访问。
5. 类的类型适应性是指:派生类对象可以赋值给该类的基类对象,反之不成立
。
6. 在多重继承情况下可以使用 :: 运算符进行限定的方法来解决继承中的二义性问
题。
7. 多重继承方式下,处于同一层次的基类构造函数的执行顺序由派生类的 (对基类的)继承顺序 决定。
一、选择题
1. 下列选项中,正确的是( )
A. 类的构造函数可以重载 B. 一个类可以有多个析构函数
C. 析构函数不能是虚函数 D. 在类中可以有自身类的数据对象成员
2. 不是构造函数的特征的是( )
A. 构造函数可以重载
B. 不能定义指向构造函数的指针
C. 构造函数在定义对象时由系统自动调用
D. 构造函数可以是虚函数
3. 关于析构函数的叙述中,不正确的是( )
A. 析构函数可以定义为虚函数
B. 基类的析构函数可以被派生类继承
C. 当系统撤销对象时,自动调用析构函数
D. 如果没有定义析构函数,编译系统自动生成析构函数
4. 类成员格式中,能正确表示纯虚函数的是( )
A. virtual void fun(int); B. void fun(int)=0;
C. virtual void fun()=0; D. virtual void fun(int){}
5. 带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对
虚基类子对象初始化( )
A. 与虚基类下面的派生类个数有关 B. 多次
C. 二次 D. 一次
6. 解决二义性问题的方法有( )
A. 只能使用作用域运算符 B. 使用作用域运算符或赋值兼容规则
C. 使用作用域运算符或虚基类 D. 使用虚基类或赋值兼容规则
7. 对于下面类定义的叙述中正确的是( )
class A {
public:
virtual void func1( ) { }
void func2( ) { }
};
class B: public A {
public :
void func1( ) { cout<<"class B func1"< virtual void func2( ) { cout<<"class B func2"< }; A. A::func2()和B::func1()都是虚函数 B. A::func2()和B::func1()都不是虚函数 C. B::func1()是虚函数,而A::func2()不是虚函数 D. B::func1()不是虚函数,而A::func2()是虚函数 8. 多态性是指同一个接口名称具有( ) A. 统一的消息 B. 多种消息 C. 多种功能 D. 统一的功能 9. 实现C++语言多态机制的是( ) A. 类的嵌套 B. 类的继承和嵌套 C. 继承和虚函数 D. 抽象类 10. 所谓多态性是指( ) A. 不同的对象调用不同名称的函数 B. 不同的对象调用相同名称的函数 C. 一个对象调用不同名称的函数 D. 一个对象调用不同名称的对象 11.关于抽象类的描述中,正确的是( ) A. 不能说明抽象类的指针或引用 B. 可以说明抽象类对象 C. 抽象类的纯虚函数的实现可以由类自身给出,也可以由派生类给出 D. 抽象类的纯虚函数的实现由派生类给出 12. 下列叙述中,正确的是( ) A. 构造函数调用虚函数采用动态联编 B. 构造函数可以说明为虚函数 C. 当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数 D. 析构函数调用虚函数采用动态联编 13. 不属于动态联编实现条件的是( ) A. 在构造函数中调用虚函数 B. 要有说明的虚函数 C. 指向对象的指针或引用可调用虚函数 D. 派生类中重定义虚函数 14. 多重继承的构造顺序可分为如下4步: (1) 所有非虚基类的构造函数按照它们被继承的顺序构造; (2) 所有虚基类的构造函数按照它们被继承的顺序构造; (3) 所有子对象的构造函数按照它们声明的顺序构造; (4) 派生类自己的构造函数体; 这4个步骤的正确顺序是( ) A. (4)(3)(1)(2) B. (2)(4)(3)(1) C. (2)(1)(3)(4) D. (3)(4)(1)(2) 15. 设置虚基类的目的是( ) A. 简化程序 B. 消除二义性 C. 提高运行效率 D. 减少目标代码 16. 当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中( ) A. 都是虚函数 B. 只有被重新说明时才能是虚函数 C. 都不是虚函数 D. 只有被重新说明为virtual时才是虚函数 17. 关于动态关联的描述中,正确的是( ) A. 动态关联是以虚函数为基础的 B. 动态关联是在编译时确定所调用函数代码的 C. 动态关联调用函数操作只能使用指向对象的指针 D. 动态关联是在编译时确定执行函数的 18. 动态联编又称为( ) A. 多态 B. 动态束定 C. 动态约束 D. 动态约定 19. 静态联编又称为( ) A. 静多态 B. 静态约定 C. 静态约束 D. 静态束定 20. 下面对虚函数的调用的说法中,正确的是( ) A. 不一定使用动态联编 B. 必须使用动态联编 C. 一定使用静态联编 D. 一定使用动态联编 21. 下列关于纯虚函数和抽象类的描述中,错误的是( ) A. 纯虚函数是一种特殊的虚函数,它没有具体的操作内容 B. 抽象类是指具有纯虚函数的类 C. 一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类 D. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 22. 下列描述中,( )是抽象类的特征。 A. 可以说明虚函数 B. 可以进行构造函数重载 C. 可以定义友元函数 D. 不能说明其对象 23. 在派生类中重新定义虚函数时,除了( )方面,其它方面都必须与基类中相应的虚函数 保持一致。 A. 参数个数 B. 参数类型 C. 函数名 D. 函数体 24. ( )是一个在基类中说明但要求任何派生类都必须定义自己版本的函数。 A. 虚析构函数 B. 虚构造函数 C. 纯虚函数 D. 静态成员函数 25. 面向对象系统的多态性是( ) A. 不同的对象收到相同的消息时产生不同的动作 B. 不同的对象收到相同的消息时产生相同的动作 C. 相同的对象收到相同的消息时产生不同的动作 D. 相同的对象收到相同的消息时产生相同的动作 26. C++语言支持两种多态性:编译时的多态性和( ) A. 运行时的多态性 B. 封装时的多态性 C. 调试时的多态性 D. 链接时的多态性 27. 下列虚基类的声明中,正确的是( ) A. class virtual B:public A B. virtual class B:public A C. class B:public A virtual D. class B:virtual public A 28. 编译时的多态性可以通过使用( )获得。 A. 虚函数和指针 B. 重载函数和析构函数 C. 虚函数和对象 D. 虚函数和引用 29. 下面关于构造函数和析构函数的描述中错误的是( ) A. 析构函数中调用虚函数采用静态联编 B. 对虚析构函数的调用可以采用动态联编 C. 当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数 D. 构造函数可以声明为虚函数 30. 下面的描述中,正确的是( ) A. virtual可以用来声明虚函数 B. 含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类 C. 即使基类的构造函数没有参数,派生类也必须建立构造函数 D. 静态数据成员可以通过成员初始化列表来初始化 31. 下列关于构造函数的说法中正确的是( ) A. 可以取构造函数的地址 B. 构造函数可以继承 C. 构造函数可以是虚函数 D. 构造函数在创建对象时被自动调用 32. 一般来说,调用非虚成员函数的速度与调用虚成员函数的速度相比( ) A. 要快 B. 要慢 C. 相同 D. 不可比较 33. 下列关于抽象类的说法中错误的是( ) A. 抽象类的作用是为一个派生类族建立一个公共接口 B. 抽象类的派生类不再是抽象类 C. 抽象类不能实例化 D. 可以定义一个抽象类的指针或引用 34. 在C++中定义抽象类的关键字是( ) A. volatile B. virtual C. abstract D. using 35. 下列关于虚函数的描述中错误的是( ) A. 虚函数用关键字virtual声明 B. 虚函数可以是静态成员函数 C. 虚函数的调用不一定使用动态联编 D. 析构函数可以是虚函数 36. 下列关于运行多态性的描述中错误的是( ) A. 类之间应满足赋值兼容规则 B. 需要声明虚函数 C. 由成员函数或者通过指针、引用来访问虚函数 D. 在编译的时候确定被调用函数 37. 下列关于多态性的描述中,错误的是( ) A. 动态多态性是通过类的继承和虚函数来实现的 B. 静态多态性是通过函数的重载或运算符的重载来实现的 C. 多态性通常使用虚函数或重载技术来实现 D. 为实现动态多态性,基类必须定义为含有纯虚函数的抽象类 二、填空题 1. 在C++语言中,用inline说明的函数将采用 静态 联编调用该函数。 2. 在动态联编中,被调用函数是在 运行 阶段确定的。 3. 在静态联编中,被调用函数是在 编译 阶段确定的。 4. 消除继承中的二义性的两种方法分别是:使用作用域运算符::指明其继承的途径 和 使用虚基类。 5. C++中引进虚基类的目的是:消除继承中的二义性。 6. 抽象类是指 含有纯虚(成员)函数的类。 7. 抽象类不能定义 对象,但可以定义 对象指针 和 对象引用。 8. 不允许是虚函数的类的成员函数是 构造函数。 9. #define所定义的带参数的宏采用 静态(早期) 联编。 10. inline说明的函数采用 静态(早期) 联编。 11. 若在派生类构造函数的成员初始化列表中出现了虚基类和非虚基类的构造函数的调用,则它们的执行顺序是:先执行 虚基类 的构造函数,再执行 非虚基类 的构造函数。 12. 在C++中,一个名字可具有多种语义的特性称为 多态性。 一、选择题 1. 要求打开文件D:\file.dat,并可写入数据,正确的语句是( ) A. ifstream in("D:\file.dat",ios::in); B. ifstream in("D:\\file.dat",ios::in); C. ofstream in("D:\file.dat",ios::out); D. fstream in("D:\\file.dat",ios::in|ios::out); 2. 在C++程序中打开一个文件,则与该文件建立关联的是( ) A. 类 B. 流 C. 对象 D. 结构 3.以二进制方式把浮点型变量d写入输出文件流对象out中,正确的是( ) A. out.write((float*)&d, sizeof(float)); B. out.write((float*)&d, d); C. out.write((char*)&d, sizeof(float)); D. out.write((char*)&d, d); 4. 用ofstream定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为( ) A. ios::in B. 没有 C. ios::int|ios::out D. ios::out 5. 输入输出流控制符setw用于控制( ) A. 输出精度 B. 输出宽度 C. 对齐方式 D. 填充字符 6. 若有定义:char s[50];,要求从键盘输入字符串“How do you do!”到s数组中,下列操作正确的 是( ) A. cin.getline(s,50); B. cin>>s; C. cin.get(s); D. cin.getline(s); 7. 用来改变浮点型数据输出宽度的操作符是( ) A. precision() B. setwidth C. setprecision D. setiow 8. 设置输出宽度的操作符是( ) A. ios B. setin C. setw D. width 9. 已知:int a,*pa=&a;,输出指针pa十进制地址值的方法是( ) A. cout< 10. 下列输出字符.A.的方法中,错误的是( ) A. cout<第十二章 输入输出流