《C++程序设计》(高起专)练习题一一、单项选择题1.C++是一种()的程序设计语言。A.面向对象B.即可面向过程,又可面向对象C.面向过程D.面向系统2.在下面有关析构函数特征的描述中,正确的是()。A.一个类中可以定义多个析构函数B.析构函数名与类名完全相同C.析构函数不能指定返回类型D.析构函数可以有一个或多个参数3.下面对于友元函数描述正确的是()。A.友元函数的实现必须在类的内部定义B.友元函数是类的成员函数C.友元函数破坏了类的封装性和隐藏性D.友元函数不能访问类的私有成员4.下面描述中,表达错误的是()。A.公有继承时基类中的public成员在派生类中仍是public的B.公有继承时基类中的private成员在派生类中仍是private的C.公有继承时基类中的protected成员在派生类中仍是protected的D.保护继承时基类中的public成员在派生类中是private的5.所谓多态性是指()A.不同的对象调用不同名称的函数B.不同的对象调用相同名称的函数C.一个对象调用不同名称的函数D.一个对象调用不同名称的对象6.重载赋值操作符时,应声明为()函数。A.友元B.虚C.成员D.多态7.下列对模板的声明错误的是()。A.templateclassT1,typenameT2B.templateclassT1,T2C.templatetypenameTD.templateclassT1,classT2,classT38.下列类中()不是输入流类istream的派生类。A.ifstreamB.istrstreamC.iostreamD.ofstream9.()不是构造函数的特征。A.构造函数的函数名与类名相同B构造函数可以重载C.构造函数可以设置缺省参数D构造函数必须指定类型说明10.下列语句中错误的是()。A.int*p=newint(10);B.int*p=newint[10];C.int*p=newint;D.int*p=newint[40](0)11.下列关于虚基类的描述,错误的是()A.设置虚基类的目的是为了消除二义性B.虚基类的构造函数在非虚基类之后调用C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用D.若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数12.已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,()是正确的。A.voidprint()const;B.constvoidprint();C.voidconstprint();D.voidprint(const);13.在下面有关静态成员函数的描述中,正确的是()。A.在静态成员函数中可以使用this指针B.在建立对象前,就可以为静态数据成员赋值C.静态成员函数在类外定义时,要用static前缀D.静态成员函数只能在类外定义14.在下列关键字中,用于说明类中公有成员的是()。A.publicB.privateC.protectedD.friend15.以下有关继承的叙述正确的是()。A.构造函数和析构函数都能被继承B.派生类是基类的组合C.派生类对象除了能访问自己的成员以外,不能访问基类中的所有成员D.基类的公有成员一定能被派生类的对象访问16.下列各种高级语言中,不是面向对象的程序设计语言的是()。A.C++B.JavaC.VBD.C17.下列说法中正确的是()。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.如有以下模板类定义:TemplateclassTclasssum{Ta,b;Public:sum(Tx,Ty);}则在类体外定义构造函数正确的是()。A.templateclassTsum::sum(Tx,Ty){a=x;b=y;}B.templatetypenameTsum::sum(Tx,Ty){a=x;b=y;}C.templateclassTsumT::sum(Tx,Ty){a=x;b=y;}D.sumT::sum(Tx,Ty){a=x;b=y;}23.写一个C++文件,要创建一个()流对象。A.ifstreamB.ofstreamC.cinD.cout24.下面有关重载函数的说法中正确的是()。A.重载函数必须具有不同的返回值类型;B.重载函数形参个数必须不同;C.重载函数必须有不同的形参列表;D.重载函数名可以不同;25.一个函数功能不太复杂但要求被频繁调用,应选用()。A.内联函数B.重载函数C.递归函数D.嵌套函数26.关于new运算符的下列描述中,()是错的。A.它可以用来动态创建对象和对象数组B.使用它创建的对象和对象数组可以使用运算符delete删除C.使用它创建对象时要调用构造函数D.使用它创建对象数组时必须指定初始值27.可以用p.a的形式访问派生类对象p的基类成员a,其中a是()。A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员28.若有定义“intx=17;”,则语句“coutoctx;”的输出结果是()。A.11B.0x11C.21D.02129.已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明()。A.f1和f2都是静态函数B.f1是静态函数,f2不是静态函数C.f1不是静态函数,f2是静态函数D.f1和f2都不是静态函数30.假设Sample是个类,则语句“Samplea[2],*p[3];”调用构造函数的次数为()。A.0B.2C.3D.531.C++利用()实现面向对象程序设计的封装性。A.构造数据类型——类B.构造数据类型——枚举C.类的派生机制D.函数重载与运算符重载32.在声明类时,下面的说法正确的是()。A.可以在类的声明中给数据成员赋初值B.数据成员的数据类型可以是registerC.private、public、protected可以按任意顺序出现D.没有用private、public、protected定义的数据成员是公有成员33.假设已经有定义constchar*constname=chen;下面的语句中正确的是()。A.name[3]='a';B.name=lin;C.name=newchar[5];D.coutname[3];34.要将类A说明是类B的虚基类,正确的描述是()A.classvirtualB:publicAB.classB:virtualpublicAC.virtualclassB:publicAD.classB:publicAvirtual35.下列关于纯虚函数的描述中,正确的是()。A.纯虚函数是一种特殊的虚函数,它是个空函数B.具有纯虚函数的类称为虚基类C.一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数D.具有纯虚函数的类不能创建类对象36.能用友元函数重载的运算符是()。A.+B.=C.[]D.-37.下面函数模板定义中不正确的是()A.templateclassTB.templateclassTTF(Tx){returnT+x;}TF(Tx){returnx+x;}C.templateclassTD.templateclassTTF(Tx){returnx*x;}TF(Tx){returnx1;}二、判断题1.静态的成员函数没有隐含的this指针,所以它们只能访问静态的数据成员。()2.通过类对象可以访问类中所有的成员。()3.构造函数是可以被派生类继承的。()4.构造函数和析构函数都可以是虚函数。()5.只有类中全部函数都为纯虚函数时,该类才被称为抽象类。()6.对于同一个运算符来说,重载的运算符的优先级比未重载的运算符的优先级高。()7.一个类的友元一定是另一个类的成员函数。()8.C++中,对象保存在内存中,栈内存是自动分配和释放的,而堆内存需要用户自己申请和释放。()9.C++不允许定义有默认参数的函数。()10.构造函数和析构函数都不能重载。()11.构造函数和析构函数都不可以由程序员调用,只能由系统自动调用。()12.凡是用inline说明的函数一定是内联函数。()13.友元函数是独立于当前类的外部函数。()14.静态成员函数与在一般的成员函数一样,都隐含有一个this指针。()15.C++编译器不能够区分重载的无参函数和缺省参数的函数。()16.指针和引用都是变量,都占有单独的内存空间。()17.一个类可以定义多个构造函数和多个析构函数。()18.构造函数是不能说明它的返回值类型的,但可以说明为void类型。()三、简答题1.什么是封装性?请举例说明。2.什么是函数重载和运算符重载?为什么要使用重载?3.拷贝构造函数在哪几种情况下被调用?4.什么是类?什么是对象?对象与类的关系是什么?5.什么是面向对象程序设计?6.什么是继承性?请举例说明。7.结构struct和类class有什么异同?8.在定义拷贝构造函数时,为什么通常还要定义一个重载的赋值运算符?9.什么是消息?消息具有什么性质?10.若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?四、程序分析题1.指出下面程序中的1处错误,并说明原因。#includeiostream.hclassPoint{intX,Y;public:Point(){X=0;Y=0;}Point(intx=0,inty=0){X=x;Y=y;}voiddisplay(){coutX,Yendl;}};voidmain(){Pointp;p.display();}答:2.指出下面程序中的1处错误,并说明原因。#includeiostream.hclassCTest{public:CTest(){x=20;}private:intx;friendvoidfriend_f(CTestfri);};voidfriend_f(CTestfri){fri.x=55;}voidmain(){CTestc1,c2;c1.friend_f(c2);}答:3.写出下面程序的运行结果。#includeiostream.hclassTest{private:intnum;public:Test(intn=0){num=n;num++;}~Test(){cout”Destructorisactive,number=”numendl;}};voidmain(){Testx[2];cout”Exitingmain”endl;}答:4.写出下面程序的运行结果。#includeiostream.hclassTest{private:staticintval;inta;public:staticintfunc();staticvoidsfunc(Test&r);};intTest::val=20;intTest::func(){val--;returnval;}voidTest::sfunc(Test&r){r.a=25;coutResult3=r.a;}voidmain(){coutResultl=Test::func()endl;Testa;coutResult2=a.func()endl;Tes