1、 Visual C+ 程序设计基础练习题 第二部分 面向对象的程序设计 1 一、复习并回答下列问题: 1. 什么是类,类的定义格式如何?类中成员的访问权限有哪些? 2. 类中的数据成员和成员函数有何区别?对成员函数的定义有何规定? 3. 什么是对象?对象的定义格式如何?对象成员如何表示?指向对象指针的成员如何表示? 4. 构造函数的功能和特点有哪些?析构函数的功能和特点又有哪些?默认构造函数和默认析构函数有何特点? 5. 拷贝构造函数的功能和特点是什么?默认拷贝构造函数有何用处? 6. 成员函数具有 哪些特征? 7. 静态数据成员如何定义?如何引用?它有何特点?静态成员函数有何特点? 8. 友
2、元函数如何定义?它有什么特点?友元类如何定义?它又有何特点? 9. 类的作用域是什么?按生存期如何划分对象? 10.什么局部类? 11.什么是指向对象的指针?什么是对象的引用?它们如何被定义?它们的主要功能是什么? 12.什么是对象数组?什么是对象数组指针?它们是如何定义的? 13.this 指针的含义是什么?为什么在程序中很少见到? 14.指向一维对象数组的指针是如何定义的?它的功能是什么? 15.什么是对象指针数 组?它是如何被定义的? 16.如何使用 const 来说明指针常量?使用 const 说明常量时应注意些什么? 17.如何说明 const 成员函数? const成员函数有何特点
3、? 18.const 数据成员如何初始化? 19.什么是对象成员?如何对对象成员进行初始化? 20.使用 new 运算符创建对象时和创建对象数组时有何不同? 21.什么是转换函数?如何定义一个转换函数?转换函数有何功能? 22.什么是继承性?为什么说它是面向对象语言中的重要机制? 23.C+语言中继承分为哪两类?继承方式又分为哪三种?三种不同继承方式 有何特点? 24.不同继承方式中,说明下列各种情况对于基类成员访问有何不同? A) 派生类 B) 派生类的对象 C) 派生类的派生类 25.如何定义单继承的派生类?如何定义多继承的派生类? 26.派生类与基类之间有什么关系? 27.单继承中 ,
4、派生类的构造函数如何定义? 2 28.多继承中 , 派生类的构造函数如何定义? 29.什么是子类型?它有何作用? 30.多继承中那些情况下会出现二义性?如何消除? 31.为什么要引入虚基类?带有虚基类的派生类构造函数有什么特点? 32.什么是多态性? 为什么说 “多态性是继承性的补充 “? 33.什么是函数重载?定义重载函数时应注意哪些问题? 34.什么是运算符重载?是否所有的运算符都能重载? 35.运算符重载的定义格式如何?运算符重载有几种形式? 36.运算符被重载后与原运算符有何关系? 37.什么是编译时多态性和运行时多态性? 38.什么是虚函数?如何说明虚函数?是否所有的成员函数都可以说
5、明为虚函数? 39.什么是纯虚函数?什么是抽象类? 40.虚析构函数有何功能? 41.总结 c+语言的多态性包含哪些内容? 42.在 C+的输入输出操作中 ,如何理解 “流 “的概念?从流的角度说明什么是提取操作?什么是插入操作? 43.系统预定的流类对象中, cin 和 cout 的功能是什么? 44.从键盘上输入一个字符有哪些方法?输入一个字符串有哪些方法? 45.向屏幕上输出一个字符有哪些方法?输出一个字符串有哪些方法? 46.如何将一个 int 型的数按不同进制形式输出? 47.如何输出一个指定精度的浮点数? 48.如何确定输出数据项的宽度? 49.打开和关闭一个磁盘文件有哪些方法?
6、50.读写磁盘文件中信息有哪些方法? 51.如何对文件进行随机存取操作? 二、填空 1. 关于类定 义格式的描述中, D是错的。 A)一般类的定义格式分为说明部分和实现部分 B)一般类中包含有数据成员和函数成员 C)类中成员可设置以下访问方式之一: public,private,protected D)函数成员都应是公有的、数据成员都应是私有的 2. 下列关键字中, C不是类定义中使用的关键字。 A)class B)public C)switch D)private 3.下列叙述中,不正确的是 B。 A)类的构造函数可以重载 B)类的析构函数可 以重载 C)一个类可以不定义构造函数 D)一个类
7、可以不定义析构函数 3 4. 关于类中成员函数的描述中, B是错的。 A)类中可以说明一个或多个成员函数 B)类中的成员函数只能定义在类体外 C)定义在类体外的成员函数前加 inline 可以成为内联函数 D)在类体外定义成员函数时,在函数名前除了加类型说明符外,还需用作用域运算符限定该成员函数所属的类 5. 关于对象的描述中, A是错的。 A)同一个类创建的若干个对象的数据结构和其内容都是不相同的 B)对象的成员表示与 C语言中结构变量的成员表示相同 C)一个类可以定义多个对象、指向对象的指针和对象数组 D)一个对象在定义时就被初始化 6. 下列是构造函数的特点, C是错的。 A)构造函数是
8、一种成员函数,它具有一般成员函数的特点 B)构造函数的名称与其类名相同 C)构造函数必须指明其类型 D)一个类中可定义 1 个或多个构造函数 7. 下列是析构函数的特点, A是错的。 A)析构函数的名字不能与类名相同,否则将与构造函数无法区别 B)析构函数中不可以有参数 C)析构函数定 义时不必指出类型 D)析构函数也是一种成员函数 8. 拷贝构造函数具有的下列特点中, C是错的。 A)如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的 B)拷贝构造函数只有一个参数,并且是该类对象的引用 C)拷贝构造函数的名字不能用类名 D)拷贝构造函数是一种成员函数 9. 下列关于类成员函数的特性
9、中, B是错的。 A)除析构函数外,成员函数都可以重载 B)成员函数都是内联的 C)除析构函数外,成员函数都可以设置默认参数 D)成员函数可以 是公有的,也可以是私有的 10.关于静态成员的描述中, B是错的。 A)静态成员可以分为静态数据成员和静态函数成员 B)静态数据成员定义后必须在类体内进行初始化 C)静态数据成员初始化不使用其构造函数 D)静态函数成员中不能直接引用非静态成员 11.关于友元的描述中, A是错的。 A)友元函数是成员函数,它被说明在类体内 B)友元函数可直接访问类中的私有成员 4 C)友元函数破坏类的封装性,使用时应少用 D)友元类中的所有成员函数都是友元函数 12.已
10、知:类 A中的一个成员函数说明为 void Set(A其中 ,A那么 ptr应该是 A。 A)指向字符串常量的指针 B)指向字符串的常量指针 C)指向字符的常量的指针 D)指向字符常量的指针 16.已知: Print()函数是一个类的 const 成员函数,它无返回值 ,也无参数。下列关于Print()函数的各种说明中, A是正确的。 A)void Print() const; B)void const Print(); C)const void Print(); D)void Print(const); 17.下列关于对象成员的描述中, D是错误的。 A)对象成员是类的一种数据成员,它是另一
11、个类的对象 B)对象成员不可以是自身类的对象 C)对对象成员的初始化要包含在该类的构造函数中 D)一个类中只能含有一个对象成员作其成员 18.对 new 运算符的下列描述中, B是错误的。 A)它可以动态创建对象和对 象数组 B)用它创建对象数组时必须指定初始值 C)用它创建对象时要调用构造函数 D)用它创建的对象可以使用运算符 delete 来释放 19.对 delete 运算符的下列描述中, D是错误的。 A)用它可以释放用 new 运算符创建的对象和对象数组 B)用它释放一个对象时,它作用于一个 new 所返回的指针 C)用它释放一个对象数组时 ,它作用的指针名前须加下标运算符 () D
12、)它不适用于空指针 20.下列对类型转换函数的描述中, D是错误的。 A)类型转换函数是一种非 静态的成员函数 5 B)类型转换函数是无参数的 C)类型转换函数不能被定义为友元函数 D)类型转换函数必须在定义时指出返回值类型 21.下列对派生类的描述中, C是错误的。 A) 一个派生类可以作为另一个派生类的基类 B) 派生类至少应有一个基类 C) 基类中成员访问权限继承到派生类中都保持不变 D) 派生类的成员除了自己定义的成员外,还包含了它的基类成员 22.派生类的对象对它的哪一类基类成员是可以访问的? A A) 公有继承的基类的公有成员 B) 公有 继承的基类的保护成员 C) 公有继承的基类
13、的私有成员 D) 保护继承的基类的公有成员 23.关于多继承二义性的描述, D是错误的。 A) 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出 现二义性 B) 一个派生类是从具有共同的间接基类的两个基类派生来的 ,派生类对 该公共基类的访问可能出现二义性 C) 解决二义性最常用的方法是使作用域运算符对成员进行限定 D) 派生类和它的基类中出现同名函数时,将可能出现二义性 24.多继承派生类构造函数构 造对象时, B被最先调用。 A) 派生类自己的构造函数 B) 虚基类的构造函数 C) 非虚基类的构造函数 D) 派生类中子对象类的构造函数 25.定义重载函数的下列条件中, C是错误
14、的。 A)要求参数个数不同 B)要求参数类型不同 C)要求函数返回值类型不同 D)要求在参数个数相同时 ,参数类型不同 26.下列函数中, D不能重载。 A)成员函数 B)非成员函数 C)构造函数 D)析构函数 27.下列运算符中 , A不能重载。 A): B) C) 输出指针 p 所存放的十进制地址的方法是 D。 A)cout class Q int x,y; public: Q(int a=0,int b=0) x=a;y=b; Q() ; void main() Q q0; /L0 Q q1(1); /L1 Q q2(1,2); /L2 8 则以下说法正确的是 A。 A)编译器编译 L0
15、 行语句时,无法确定调用哪一个构造函数 B)编译器编译 L1 行语句时,无法确定调用哪一个构造函数 C)编译器编译 L2 行语句时,无法确定调用哪一个构造函数 D)以上程序正确 48.若有以下说明和语句: #include class Q int x,y; public: Q(int a=0,int b=0) x=a;y=b; ; void main() Q q0; /L0 Q q1(q0); /L1 Q q2=q0; /L2 则以下说法正确的是 D。 A)编译器编译 L0 行语句时,无法确定调用哪一个构造函数 B)编译器编译 L1 行语句时,无法确定调用哪一个构造函数 C)编译器编译 L2
16、行语句时,无法确定调用哪一个构造函数 D)以上程序正确 49.若有以下说明和语句: #include class Q int x,y; public: Q(int a=0,int b=0) x=a;y=b; ; void main() Q q(); /L 则以下说法正确的是 B。 A)L行说明了一个对象 q B)L行说明了一个函数原型 C)L行说明了一个对象数组 D)以上说法都不正确 9 50.以下程序输出的两个字母分别为 c和 d。 #include class X public:virtual void f() coutf(); 51.以下程序的输出结果分别是 20和 30。 #inclu
17、de class Base protected: intx; public: Base(int a) x=a; ; class A:public Base public:A(int a):Base(a) int GetX() return x; ; class B:public Base public:B(int a):Base(a) int GetX() return x; ; class C:public B,public A public:C(int a):A(a+10),B(a+20) ; void main() C c(10); cout class Q int x,y; public: