C++复习资料一、单选题:(15*2)在下列各题的备选答案中,选出一个正确答案,并将其号码填写在题目后面的括号内。1.在下面四项中,不是用来限制类中成员的访问权限的是(B)。A.privateB.protectC.publicD.protected2.在C++中,结构与类的惟一区别是(C)。A.结构只能声明数据成员,而类还可以声明成员函数;B.结构当中不可以有虚函数,而类中可以有虚函数;C.结构中成员的默认访问权限是公有的,类中则是私有的;D.结构中不允许有构造函数和析构函数,而类中可以有构造函数和析构函数。3.下面是关于构造函数的说法,不正确的是(C)。A.C++规定,每一个类必须有一个构造函数,没有构造函数就不能创建对象;B.如果没有提供一个类的构造函数(一个都未提供),则C++提供一个默认的构造函数,该默认构造函数是个无参构造函数,它仅仅负责创建对象;C.虽然一个类定义了一个构造函数(不一定是无参构造函数),C++仍然提供默认的构造函数;D.与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的。4.在下列说法中,不正确的是(C)。A.静态成员函数不能利用this指针;B.只有非静态成员才可以使用this关键字,因为静态成员没有this指针;C.构造函数和析构函数不接受任何参数,也不带有任何类型的返回值;D.虚机制在构造函数和析构函数中仍然可以很好地工作,以实现多态性。5.多重继承的构造顺序一般可分为4步,下面给出这4个步骤:step1:任何非虚基类的构造函数按照它们被继承的顺序构造;step2:任何虚基类的构造函数按照它们被继承的顺序构造;step3:任何成员对象的构造函数按照它们声明的顺序构造;step4:类自己的构造函数。这4个步骤的正确顺序是(C)。A.step4、step3、step1、step2B.step2、step4、step3、step1C.step2、step1、step3、step4D.step3、step4、step1、step26.在C++中,应该使用(A)来动态分配和释放内存。A.new,deleteB.malloc(),deleteC.malloc(),realloc()D.malloc(),free7.下面是关于虚析构函数的说法,其中不正确的是(D)。A.虚析构函数也必须遵守调用层次惟一的原则;B.虚析构函数被调用时,只有成员函数的本地版本被调用;C.可以创建一个纯虚析构函数;D.虚析构函数可以带参数。8.下列关于成员函数的述描述中,错误的是(A)。A.成员函数一定是内联函数B.成员函数可以重载C.成员函数可以设置参数的缺省值D.成员函数可以是静态的9.对虚函数的调用(D)。A.一定使用动态联编B.必须使用动态联编C.一定使用静态联编D.不一定使用动态联编10.一个const对象(B)。A.能访问所有成员函数B.只能访问const成员函数C.也能访问volatile成员函数D.能访问const和volatile成员函数11.声明类test的拷贝构造函数的正确形式是(D)。A.inttestB.voidtestC.test(void)D.test(test&)12.下面关于类的对象性质的描述,正确的是(D)。A.对象之间不可以相互赋值B.不可以说明指向对象的指针C.对象不能用作数组元素D.一个对象能用作另一个对象的成员13.在运算符成员函数中,下面(D)运算符必须为类运算符形式。A.+B.-C.++D.-14.下面关于结构和联合的叙述正确的是(A)A.结构有析构函数和构造函数,联合没有;B.结构和联合都有析构函数和构造函数;C.结构和联合都没有析构函数和构造函数;D.结构没有析构函数和构造函数,联合有;15.关于虚函数的描述中,正确的是(C)。A.虚函数是一个static类型的成员函数;B.虚函数是一个非成员函数;C.基类中说明了虚函数后,派生类中可不必在其对应的函数前使用关键字virtual;D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型。二、辨析题:(15*2)判断下列各题的正误,错误的加以改正。1、C++程序与C程序不同之一是C++只能使用cout输出而C语言只能用printf输出。答:错,C++也可以使用printf2、C++中程序的执行总是由main函数开始而开始,main函数结束而结束。答:对。3、C++中程序的执行单位是类。答:错,对象4、类是一种自定义类型,是对一类对象的抽象。对象是一个实体,是类的实例,对象由类建立,对象封装了数据和对数据操作的函数。答:对。5、派生类中的函数可以存取基类中所有非静态成员。答:错,基类的private成员不可访问6、派生类中的函数不可以与基类中的同名同参函数具有不同的类型。答:对。7、基类的指针既可以指向它的公有派生类对象,又可以指向它的私有派生类对象。答:对。8、友元就是让类外的函数或别的类访问私有区,友元不是该类的成员,它破坏了类的封装性,友元的形式参数可以是任何变量。答:对。9、构造函数是在用类定义对象时对对象进行初始化的函数,可重载。答:错。创建对象及初始化10、纯虚函数是一个特殊的虚函数。答:对。11、一个类如果是多个基类的公有派生类,由于多个公有基类在派生类中存在多个副本,会产生访问的二义性问题,消除二义性的方法是在派生时将这个基类声明为虚基类。答:对。12、C++中,若继承类中函数和基类中的函数申明完全一致,则称这两函数为虚函数。答:错,此时派生类中的函数覆盖了基类的对应函数。13、C++中,对类的析构函数同时进行重载和参数缺省时必须考虑歧义问题答:错。不需要考虑14、c++中,类的构造函数不可以是虚函数,析构函数可以是虚函数。答:对。15、C++中,当局部变量与全局变量同名时,函数无法存取全局变量。答:错,加上::后可以存取全局变量,三、程序理解题:(2*10)1、给出下面程序,正确的输出结果。#includeiostream.h#includestring.hclassCAnimal{public:CAnimal(char*pName=noname);~CAnimal();voidsetName(char*pName){strncpy(name,pName,sizeof(name));}char*getName(void){returnname;}private:charname[20];};CAnimal::CAnimal(char*pName){setName(pName);cout调用CAnimal的构造函数!endl;}CAnimal::~CAnimal(){cout调用CAnimal的析构函数!endl;}classCCat:publicCAnimal{public:CCat(){cout调用CCat的构造函数!endl;}~CCat(){cout调用CCat的析构函数!endl;}voidDispName(){cout猫的名字是:getName()endl;}};voidmain(){CCatcat;cat.DispName();cat.setName(snoopy);cat.DispName();}调用CAnimal的构造函数!调用CCat的构造函数!猫的名字是:snnopy调用CCat的析构函数!调用CAnimal的析构函数!2、下面程序执行结果错误,请修改相应语句使之能输出正确结果,并且给出正确结果。#includeiostream.hconstdoublePI=3.1415926;classCCircularShape{protected:doubleradius;public:CCircularShape(doubler){radius=r;}doublegetsurfaceArea()const{return0;}};classCCircle:publicCCircularShape{public:CCircle(doubler):CCircularShape(r){}doublegetCircumference()const{return(2*PI*radius);}doublegetsurfaceArea()const{return(PI*radius*radius);}};voidprintArea(CCircularShape&r_shape){cout面积为:((CCircle*)&r_shape)-getsurfaceArea()endl;}voidmain(){CCirclecircle(10.0);printArea(circle);}四、简答题:(5*4)1、在面向程序设计中的对象、类是什么?对象有哪些特性?2、构造函数和析构函数的作用分别是什么?在一个类中可以有几个构造函数和析构函数?它们在什么时候被调用?3、派生类对基类的公有、保护、私有成员是如何继承的?继承是如何提高代码重用率的?4、什么是函数重载?哪些函数可以重载?请分别举例。5、若一个类有基类和对象成员,在构造对象时它对基类、对象成员、它自身的构造次序是怎样一个次序?析构的次序又是怎样的呢?