C++面向对象程序设计练习题一、选择题1、C++对C语言作了很多改进,即从面向过程变成为面向对象的主要原因是____。
A.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象的概念2、在C++中,数据封装要解决的问题是_____。
A、数据的规范化B、防止不同模块之间数据的非法访问C、避免数据丢失D、便于数据转换3、下面对析构函数的正确描述是_______。
A、析构函数没有参数B、析构函数必须由用户定义C、系统不能提供默认的析构函数D、析构函数可以设置默认参数4、关于成员函数特征的下列描述中,_________是错误的。
A、成员函数可以是静态的B、成员函数可以重载C、成员函数一定是内联函数D、成员函数可以设置缺省参数值5、关于继承的描述中,________是正确的。
A、析构函数不能被继承B、派生类是基类的子集C、子类型关系是可逆的D、派生类是基类的子类型6、下面函数原型声明中,_______声明了fun为虚函数A、void fun( )=0;B、virtual void fun( );C、virtual void fun( )=0;D、virtual void fun( ){};7、下列静态数据成员的特性中,_________是错误的。
A、静态数据成员不是所有对象所共用的B、说明静态数据成员时前边要加修饰符staticC、静态数据成员要在类体外进行初始化D、引用静态数据成员时,要在其名称前加<类名>和作用域运算符8、声明一个类的对象时,系统自动调用_________函数,撤消对象时,系统自动调用_________函数。
①普通函数;②纯虚函数;③析构函数;④成员函数;⑤构造函数⑥New函数A、③①B、④②C、⑥③D、⑤③9、关于delete运算符的下列描述中,_________是错误的。
A、它必须用于new返回的指针;B、对一个指针可以使用多次该运算符;C、使用它删除对象时要调用析构函数;D、指针名前只有一对方括号符号,不管所删除数组的维数。
10、已知类A中的一个成员函数的说明如下:void Set(A &a);则该函数的参数“A &a”的含义是________。
A、变量A与a按位与后作函数参数B、将变量a的地址赋给类AC、类A对象引用a用作函数的形参D、指向A的指针为a11、下面关于友元函数的描述中,正确的是________。
A、友元函数破坏了类的封装性和隐藏性B、友元函数是类的成员函数C、友元函数的实现必须在类的内部定义D、友元函数不能访问类的私有成员12、在创建派生类对象时,构造函数的执行顺序是_________。
A、对象成员构造函数、基类构造函数、派生类本身的构造函数B、基类构造函数、对象成员构造函数、派生类本身的构造函数C、基类构造函数、派生类本身的构造函数、对象成员构造函数D、派生类本身的构造函数、基类构造函数、对象成员构造函数13、下面描述中,正确的是_________。
①虚函数是没有实现的函数②纯虚函数的实现在派生类中③抽象类指针可以指向不同的派生类④抽象类是没有纯虚函数的类A、①和②B、③和④C、②和③D、①②③④14、一个函数功能不太复杂,但要求被频繁调用,选用_______。
A、重载函数B、嵌套函数C、递归函数D、内联函数15、假设有函数模板定义如下:Template <typename T>Max(T a, T b, T &c){ c=a+b; }下列选项正确的是________。
①float x,y; float z; ②int x,y,z; ③float x; int y, z; ④int x,y; float z;Max(x,y,z); Max(x,y,z); Max(x,y,z); Max(x,y,z);A、②④B、②③C、①③D、③④16、在C++中,要实现动态联编,必须使用________调用虚函数A、类名B、派生类指针C、对象名D、基类指针17、C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过_______派生了新的类。
A、继承B、复用C、封装D、引用18、拷贝(复制)构造函数的作用是________。
A、进行数据类型的转换B、用对象初始化对象C、用对象调用成员函数D、用一般类型的数据初始化对象19、C++语言建立类族是通过________。
A、类的嵌套B、虚函数C、抽象类D、类的继承20、关于纯虚函数和抽象类的描述中,错误的是________。
A、纯虚函数是一种特殊的虚函数,它没有具体的实现B、抽象类是指具有纯虚函数的类C、一个基类中说明有纯虚函数,该基类派生类一定不再是抽象类D、抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出二、填空1、所有的面向对象程序设计语言,都支持三个共同的本质特征____对象____、类和___继承_____。
2、为了解决程序中函数调用的效率问题,引入了_____内联函数___,定义时需在函数前面加上_____inline___说明;为了提高程序的运行效率,引入了_____友元函数___,定义时需在函数前面加上friend说明。
3、利用成员函数对二元运算符进行重载时,其左操作数为_____对象本身_____,右操作数为_____重载函数的参数表中的形参_____。
4、设置虚基类的目的是___解决二义性__,可通过______virtual____标识虚基类。
5、对象是______数据____和_______函数___的封装体。
67、定义重载函数时,要从__________形参个数______和_________参数类型_______上进行区分。
8、对虚函数使用基类类型的指针或引用调用,系统使用____动态____联编;使用对象调用时,系统使用___静态_____联编。
9、C++提供的_____继承___机制允许一个派生类继承多个基类,即使这些基类是相互无关的。
三、简答题:(共20分)1、什么叫做虚基类?它有何作用? (4分)在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。
2、简述虚函数与重载函数的区别? (6分)答:(1)重载函数要求函数有相同的返回值类型和函数名称,并有不同的参数序列;而虚函数则要求这三项(函数名、返回值类型和参数序列)完全相同;(2)重载函数可以是成员函数或友员函数,而虚函数只能是成员函数;(3)重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数;(4)虚函数在运行时表现出多态功能,这是C++的精髓;而重载函数则在编译时表现出多态性。
3、派生类构造函数执行的次序是怎样的? (5分)答:派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类是指定的各基类顺序),再执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
4、什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数?(5分)答:带有纯虚函数的类是抽象类.抽象类的主要作用是通过它为一个类族建立一个公共的接口.使它们能够更有效地发挥多态特性。
抽象类声明了一组派生类共同操作接口的通用语义.面接口的完整实现,即纯虚函数的函数体,要由派生类自己给出.但抽象类的派生类并非一定要给出纯虚函数的实现.如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象类。
四、完成程序题:根据题目要求,完成程序填空。
(10分)1)对于下面定义的类MyClass,在函数f()中将对象成员m 的值修改为60的语句(划线处),请将其补充完整。
(4分)答: __① ptr - > SetValue(60)___________2)在下面程序横线处填上适当的语句,使其输出结果为0,56,56。
(6分)#include <iostream.h>class base{ public:____②____ int func( ){ return 0; }};class derived:public base{ public:int a,b,c;void setValue(int x,int y,int z){ a = x; b = y; c = z; }int func( ){return(a+b)*c;}};答:②__virtual________;③_base *pb=&d;__ 五、程序分析题:给出下面程序输出结果。
(共20分)1) #include <iostream> (10分)using namespace std;class BaseClassclass MyClass { public: MyClass(int x) { m=x; } void SetValue(int n1) {m=m1;}private:int m; };int f() { MyClass *ptr=new MyClass(40); _____①_____; } void main( ) { base b; derived d; cout<<b.func( )<<′,′; d.setValue(3,5,7); cout<<d.func( )<<′,′; _______③______ cout<<pb->func( )<<end1;}{public:BaseClass() { cout << "BaseClass Constructor!" << endl;}~BaseClass() { cout << "BaseClass Destructor!" << endl;}};class DerivedClass : public BaseClass{ public:DerivedClass() {cout << "DerivedClass Constructor!" << endl;}~DerivedClass() {cout << "DerivedClass Destructor!" << endl;}};int main(){ DerivedClass d;return 0;}程序运行的结果为:(1)__BaseClass Constructor!___; (2)_ DerivedClass Constructor!_(3)_ DerivedClass Destructor!_; (4)__ BaseClass Destructor!__ (10分)程序运行的结果为:(1)_______a=0 b=0 c=0 _____; (2)______ a=1 b=0 c=0 _(3)______ a=1 b=3 c=0 ______; (4)______ a=1 b=3 c=5 ___六、编程题 (10分)声明一个哺乳动物Mammal 类,再由此派生出狗Dog 类,二者都定义Speak( )class B :public A { public : B(){c=0;} B(int i):A(i){c=0;} B(int i,int j):A(i,j){c=0;} B(int i,int j,int k):A(i,j){c=k;} void display1() { display(); cout<<" c="<<c<<endl; } private: int c;};int main() {B b1; B b2(1); B b3(1,3); B b4(1,3,5); b1.display1(); b2.display1(); b3.display1(); b4.display1(); return 0;}2) #include <iostream>using namespace std;class A{ public:A(){a=0;b=0;}A(int i){a=i;b=0;}A(int i,int j){a=i;b=j;} void display() {cout<<"a="<<a<<" b="<<b; } private: int a,b; };成员函数,基类中定义为虚函数。