还剩33页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
语法扩充
1.1选择题在C++中用(D)能够实现将参数值带回a)数组b)指针c)引用d)上述ABC都可考虑函数原型voidtestintaintb=7char*ch=*下面的函数调用中,属于不合法调用的是(C)Atest5Btest58Ctest6#Dtest00*;已知:intm=10;下列表示引用的方法中,正确的是(C)AintZ;Bintt=10;CintX=m;Dfloatf=m;下列不是函数重载所要求的条件是:(D)A函数名相同B参数个数不同C参数类型不同D函数返回值类型不同在C++中执行以下4条语句后输出rad值为Cstaticinthot=200;intrad=hot;hot=hot+100;coutradendl;A0B100C300D200系统在调用重载函数时,不能作为确定哪个重载函数被调用的依据是(D)A参数个数B参数类型C函数名称D函数的返回值类型对C++语言和C语言的兼容性,描述正确的是(A)AC++兼容CBC++部分兼容CCC++不兼容CDC兼容C++在C++中使用流进行输入输出,其中用于屏幕输出的对象是(C)AcerrBcinCcoutDcfile对使用关键字new所开辟的动态存储空间,释放时必须使用(C)AfreeBcreateCdeleteDrealse在函数调用时,如某一默认参数要指明一个特定值,则有(A)A其之前所有参数都必须赋值B其之后所有参数都必须赋值C其前、后所有参数都必须赋值D其前、后所有参数都不必赋值下列哪个类型函数不适合声明为内联函数(A)A函数体语句较多B函数体语句较少C函数执行时间较短D函数执行时间过长intFuncint,int;不可与下列哪个函数构成重载(B)AintFuncint,int,int;BdoubleFuncint,int;CdoubleFuncdouble,double;DdoubleFuncint,double;下面的哪个保留字不能作为函数的返回类型(C)AvoidBintCnewDlong一个函数功能不太复杂,但要求被频繁调用,选用(A)A.内联函数B.重载函数C.递归函数D.嵌套函数已知函数f的原型为voidfintachar*b;变量st的定义是ints;chart[]=ABCD;把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是(C)Afst;Bfst;Cfst;Dfst;若定义cinstr;当输入MicrosoftVisualStudio
6.0!所得结果是str=(B)A、MicrosoftVisualStudio
6.0!B、MicrosoftC、MicrosoftVisualD、MicrosoftVisualStudio
6.
0.函数模板(C)A、代表某一具体函数B、与模板函数是同一个函数C、与某一个具体的数据类型连用D、是模板函数实例化的结果在C++中,关于下列设置参数默认值的描述中,正确的是(C)A、不允许设置参数的默认值B、设置参数默认值只能在定义函数时设置C、设置参数默认值时,应该是先设置右边的再设置左边的D、设置参数默认值时,应该全部参数都设置下列表示引用的方法中,(A)是正确的已知:k=1000;A、intx=k;B、chary;C、intz=1000;D、floatt=k;有如下模板定义templateclassTTfunTxTy{returnx*x+y*y;}在下列对fun的调用中,错误的是(C)Afun28Bfun
2.
08.2Cfun
2.38Dfun‘2’’8’通常情况下,函数模板中的类型参数个数不能是AA0个B1个C2个D3个
1.2填空题
1、假定有如下定义intx;若要将整型变量y定义为变量x的引用则应使用的定义语句是_inty=x;________具有相同函数名但具有不同参数表的函数称为重载函数
2、在进行函数调用时将把参数的值传递给值参数把参数的_地址_传递给引用参数
3、执行完下列三条语句后指针变量c指向__b___Intab*c=a;int*p=c;p=b;
4、假设有如下函数定义:voidFunintxinty=100;则语旬Fun5语句__Fun5,100_等价
5、在一个C++程序中每个变量都必须遵循__先定义后使用__的原则
6、下面是一个求数组元素之和的程序主程序中定义并初始化了一个数组,然后计算该数组各元素之和并输出结果函数TotalSum计算数组元素之和请完成下列程序#includeiostream.h__int Totalsumint array[]int len__;voidmain{inta
[5]={236810};__intTotal___;Total=Totalsuma5;coutSumofarray:Totalendl;}intTotalsumintarray[]intlen{____intsum=0____;forintI=0;____Ilen____;I++____sum+=array[I]_____;returnsum;}
7、下面的函数Fun未使用中间变量实现了对两个数的交换请完成下列函数的定义VoidFunintxinty{x+=y;y=___x-y____;__x=x-y_____;}
8、定义一个函数时,若只允许函数体访问形参的值而不允许修改它的值则应把该形参声明为__常量__即在该形参声明的前面加上__const__关键字进行修饰
9、在一个函数的定义或声明前加上关键字__inline__时,该函数就声明为内联函数
1.3简答题A、.内联函数的含义 在函数前加上关键字inline说明了一个内联函数,这使一个函数在程序行里进行代码扩展而不被调用这样的好处是减少了函数调用的开销,产生较快的执行速度但是由于重复编码会产生较长代码,所以内联函数通常都非常小如果一个函数在类说明中定义,则将自动转换成内联函数而无需用inline说明B、.函数重载的含义 在同一作用域范围内,相同的函数名通过不同的参数类型或参数个数可以定义几个函数,编译时编译器能够识别实参的个数和类型来决定该调用哪个具体函数需要注意的是,如果两个函数仅仅返回类型不同,则编译时将会出错,因为返回类型不足以提供足够的信息以使编译程序判断该使用哪个函数所以函数重载时必须是参数类型或者数量不同C、引用与指针的区别D、内联函数使用上的限制E、定义带默认参数值函数的规则F、指针与常量的关系
1.4程序阅读题1)写出下列程序的运行结果#includeiostream.hvoidmain{intx;intp=x;x=10;p=x+10;coutxpendl;}结果20202)写出下列程序的运行结果#includeiostream.hintfinta{return++a;}intginta{return++a;}voidmain{intm=0n=0;m+=fgm;n+=ffn;coutm=mendl;coutn=nendl;}结果m=3n=23写出下列程序的运行结果#includeiostream.hvoidFun{intnum=20;coutTheFunsnumisnumendl;}voidmain{intnum=10;coutThemainsnumisnumendl;Fun;{intnum=30;coutTheFieldsnumisnumendl;}coutThemainsnumisnumendl;}结果Themainsnumis10TheFunsnumis20TheFieldsnumis30Themainsnumis10类和对象
2.1选择题下列的各类函数中,不是类的成员函数(C)A构造函数B析构函数C友元函数D拷贝初始化构造函数作用域运算符“”的功能是(B)A标识作用域的级别的B指出作用域的范围的C给定作用域的大小的D标识成员是属于哪个类的已知print函数是一个类的常成员函数,它无返回值,下列表示中,是正确的(A)Avoidprintconst;Bconstvoidprint;Cvoidconstprint Dvoidprintconst;在类定义的外部,可以被访问的成员有(C)A所有类成员Bprivate的类成员Cpublic的类成员Dpublic或private的类成员关于类和对象不正确的说法是(C)A类是一种类型,它封装了数据和操作B对象是类的实例C一个类的对象只有一个D一个对象必属于某个类在C++中实现封装是借助于BA枚举B类C数组D函数定义析构函数时,应该注意(C)A其名与类名完全相同B返回类型是void类型C无形参,也不可重载D函数体中必须有delete语句类claseCC1的说明如下,错误的语句是(A)claseCC1{inta=2;//ACC1;//Bpublic:CC1intval;//C~CC1;//D};类的指针成员的初始化是通过函数完成的,这个函数通常是BA析构函数B构造函数C其它成员函数D友元函数关于构造函数的说法,不正确的是(A)A没有定义构造函数时,系统将不会调用它B其名与类名完全相同C它在对象被创建时由系统自动调用D没有返回值通常拷贝构造函数的参数是(C)A对象名B对象的成员名C对象的引用名D对象的指针名关于成员函数特征的描述中,错误的是(A)A成员函数一定是内联函数B成员函数可以重载C成员函数可以设置参数的默认值D成员函数可以是静态的下列关于构造函数的描述中,错误的是(D)A构造函数可以设置默认参数;B构造函数在定义类对象时自动执行C构造函数可以是内联函数;D构造函数不可以重载有如下类声明“classA{intx;……};”,则A类的成员x是(B)A公有数据成员B私有数据成员C公有成员函数D私有成员函数类TM和类TN是两个独立的类,那么类TM中哪种形式的数据成员一定是不允许的CATM*aBTNaCTMaDTNa;以下关于this指针的叙述中正确的是(D)A任何与类相关的函数都有this指针;B类的成员函数都有this指针;C类的友员函数都有this指针;D类的非静态成员函数才有this指针;.关于类模板的说法正确的是(B)A类模板的主要作用是生成抽象类B类模板实例化时,编译器将根据给出的模板实参生成一个类C在类模板中的数据成员具有同样类型D类模板中的成员函数没有返回值.以下关键字不能用来声明类的访问权限的是(C)ApublicBprivateCstaticDprotected.类的私有成员可在何处访问(D)A通过子类的对象访问B本类及子类的成员函数中C通过该类对象访问D本类的成员函数中.如果没有为一个类定义任何构造函数的情况下,下列描述正确的是(A)A编译器总是自动创建一个不带参数的构造函数B这个类没有构造函数C这个类不需要构造函数D该类不能通过编译.一个类可包含析构函数的个数是(B)A0个B1个C0个或1个D0个或多个.一个类可包含构造函数的个数是(D)A0个B0个或1个C0个或多个D1个或多个.this指针存在的目的是(B)A保证基类公有成员在子类中可以被访问B保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码C保证基类保护成员在子类中可以被访问D保证基类私有成员在子类中可以被访问.下列关于类的权限的描述错误的是(A)A类本身的成员函数只能访问自身的私有成员B类的对象只能访问该类的公有成员C普通函数不能直接访问类的公有成员,必须通过对象访问D一个类可以将另一个类的对象作为成员.设类A将其它类对象作为成员,则建立A类对象时,下列描述正确的是(B)AA类构造函数先执行B成员构造函数先执行C两者并行执行D不能确定.假定有类AB,有相应的构造函数定义,能正确执行“ABa4b5c
[3]*p
[2]={ab};”语句,请问执行完此语句后共调用该类构造函数的次数为(C)A3B4C5D6拷贝构造函数的作用是(C)A.进行数据类型的转换B.用对象调用成员函数C.用对象初始化对象D.用一般类型的数据初始化对象下列静态数据成员的特性中,错误的是(D)A.静态数据成员的声明以关键字static开头B.静态数据成员必须在文件作用域内初始化C.引导数据成员时,要在静态数据成员前加(类名)和作用域运算符D.静态数据成员不是类所有对象共享的通过指针访问类对象成员的方法是(D)A.:: B.; C.. D.-静态成员函数没有(B)A.返回值 B.this指针 C.指针参数 D.返回类型在下列关键字中,用于说明类中公有成员的是(A)A.public;B.private;C.protected;D.friend不是构造函数的特征(D)A.构造函数的函数名与类名相同; B. 构造函数可以重载;C.构造函数可以设置缺省参数; D. 构造函数必须指定类型说明是析构函数的特征(A)A.一个类中只能定义一个析构函数; B. 析构函数名与类名不同;C. 析构函数的定义只能在类体内; D. 析构函数可以有一个或多个参数关于成员函数特征的下述描述中,(A)是错误的A.成员函数一定是内联函数; B. 成员函数可以重载;C.成员函数可以设置参数的缺省值; D. 成员函数可以是静态的下述静态数据成员的特性中,(D)是错误的A.说明静态数据成员时前边要加修饰符static;B.静态数据成员要在类体外进行初始化;C.引用静态数据成员时,要在静态数据成员名前加类名和作用域运算符;D.静态数据成员不是所有对象所共用的
2.2填空题
1、在撤销类的对象时C++程序将自动调用该对象的__析构___函数
2、类中的构造函数是一个特殊的成员函数它由类的对象__自动_调用,它的作用是___为对象分配内存,数据成员初始化___
3、对类中的成员函数和属性的访问是通过__public__、__protected__和___private__这3个关键字来控制的
4、__delete__运算符删除new运算符所动态分配的内存空间
5、假定用户没有给一个名为MyClass的类定义析构函数则系统为其定义的默认析构函数形式为__MyClass__
6、类中构造函数有__一个或多__个析构函数有___一___个
7、类是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的___数据成员___,共同行为被描述为类中的__成员函数__
8、若要把类FriendClass定义为类MyClass的友元类则应在类MyClass的定义中加入语句_friendclassFriendClass;___
9、在结构定义中数据和成员函数默认权限是__public__在类定义中数据和成员函数默认权限是__private___
10、在下面程序的横线处填上适当的语句使类型该程序执行结果为10#includeiostream.hclassMyClass{pub1ic:___MyClassinta{_x=a;}____//为x置值__intGetNum{returnx;}______//取x值private:intx;};voidmain{Myclassmy10;Coutmy.GetNumend;}
11、完成下面的类定义ClassMyClass{public:MyClass{x=0;}____friend______intGetNum___MyClass______my;private:intx;};intGetNum____MyClass______my{___returnmy.x;}
12、__new__运算符对指定类型对象动态分配内存并返回该类型的__指针__
13、若要把函数voidFriendFunction定义为类MyClass的友元函数则应在类MyClass的定义中加入语句__friendvoidFriendFunction;_______
14、类的具体表现是通过定义_对象__来操作的
15、在定义类的对象时C++程序将自动调用该对象的__构造___函数初始化对象自身
16、一般情况下按照面向对象的要求把类中的数据成员属性定义为__private__权限而把成员函数方法定义为__public__权限
17、在类中定义和实现的函数称为_内联函数__
18、非成员函数应声明为类的__友元函数__才能访问这个类的private成员
2.3简答题A、类的含义B、构造函数的特点C、拷贝构造函数的调用D、析构函数的定义及其特点E、静态成员的分类及各自的特点
2.4程序阅读题1写出下列程序的运行结果#includeiostream.hclassMyClass{charch;public:MyClass;MyClasscharcharacter;voidPrint;~MyClass;};MyClass::MyClass{coutThisisaconstructor!endl;ch=a;}MyClass::MyClasscharcharacter{coutThisisaconstructor!endl;ch=character;}voidMyClass::Print{coutThevalueofchischendl;}MyClass::~MyClass{coutThisisadestructor!endl;}voidmain{MyClassfirstsecondb;first.Print;second.Print;}运行结果Thisisaconstructor!Thisisaconstructor!ThevalueofchisaThevalueofchisbThisisadestructor!Thisisadestructor!2)写出下列程序的运行结果#includeiostream.hclassMyClass{public:MyClass;voidPrint;~MyClass;private:intI;staticintj;};intMyClass::j=0;MyClass::MyClass{coutThisisconstructor!endl;j+=10;}voidMyClass::Print{coutThevalueofjisJendl;}MyClass::~MyClass{coutThisisadestructor!endl;}voidmain{MyClassfirstsecond;first.Print;second.Print;}Thisisconstructor!Thisisconstructor!Thevalueofjis20Thevalueofjis20Thisisadestructor!Thisisadestructor!继承与派生
3.1选择题.在C++中,类与类之间的继承关系具有(C)A自反性B对称性C传递性D反对称性.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(B)A受限制B保持不变C受保护D不受保护.按解释中的要求在下列程序划线处填入的正确语句是(C)#includeiostream.hclassBase{public:voidfun{coutBase::funendl;}};classDerived:publicBase{public voidfun{//在此空格处调用基类的函数funcoutDerived::funendl;}};Afun;BBase.fun;CBase::fun;DBase-fun;.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(C)A受限制B保持不变C受保护D不受保护.下面描述中,表达错误的是(B)A公有继承时,基类中的public成员在派生类中仍是public的B公有继承时,基类中的private成员在派生类中仍是private的C公有继承时,基类中的protected成员在派生类中仍是protected的D私有继承时,基类中的public成员在派生类中是private的.下列虚基类的声明中,正确的是(B)AclassvirtualB:publicABclassB:virtualpublicACclassB:publicAvirtualDvirtualclassB:publicA.C++设置虚基类的目的是AA消除二义性B简化程序C提高运行效率D减少目标代码classX{inta;public:Xintx=0{a=x;}};classY:publicX{intb;public:Yintx=0inty=0:Xy{b=x;}};下列语句组中出现语法错误的是(D)A.X*pa=newY12;B.Xa1=Y13;C.Yb123;Xa3=b1;D.Xa410;Yb2=a4;classBase{public:inti;Baseintt:it{}};classDerived:protectedBase{Baseb;intj;public:Derivedintt;};在构造函数Derived的下列定义中,正确的是BA.Derived::Derivedintt:btjt{}B.Derived::Derivedintt:btBasetjt{}C.Derived::Derivedintt:Basetjt{}D.Derived::Derivedintt:itbtjt{}.在哪种派生方式中,派生类可以访问基类中的protected成员(B)Apublic和privateBpublic、protected和privateCprotected和privateD仅protected在C++中,类与类之间的继承关系具有(C)A自反性B对称性C传递性D反对称性下列关于类的继承描述中,(A)是错误的A派生类可以访问基类的所有数据成员,也能调用基类的所有成员函数B派生类也是基类,但基类不一定具有派生类的全部属性和方法C继承描述类的层次关系,派生类可以具有与基类相同的属性和方法D一个基类可以有多个派生类,一个派生类可以有多个基类.当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)Apublic成员Bprivate成员Cprotected成员D友元当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的(B)Apublic成员Bprivate成员Cprotected成员D友元不论派生类以何种方法继承基类,都不能使用基类的(B)Apublic成员Bprivate成员Cprotected成员Dpublic成员和protected成员在创建派生类对象时,构造函数的执行顺序是(D)A对象成员构造函数、基类构造函数、派生类本身的构造函数B派生类本身的构造函数、基类构造函数、对象成员构造函数C基类构造函数、派生类本身的构造函数、对象成员构造函数D基类构造函数、对象成员构造函数、派生类本身的构造函数下列虚基类的声明中,正确的是(D)AclassvirtualB:publicABvirtualclassB:publicACclassB:publicAvirtualDclassB:virtualpublicA下面叙述错误的是(A)A基类的protected成员在派生类中仍然是protected的B基类的protected成员在public派生类中仍然是protected的C基类的protected成员在private派生类中是private的D基类的protected成员不能被派生类的对象访问下列说法中错误的是(A)A保护继承时基类中的public成员在派生类中仍是public的B公有继承时基类中的private成员在派生类中仍是private的C私有继承时基类中的public成员在派生类中是private的D保护继承时基类中的public成员在派生类中是protected的关于多继承二义性的描述中,错误的是(B)A一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B解决二义性的最常用的方法是对成员名的限定法C基类和派生类中同时出现的同名函数,也存在二义性问题D一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性下面叙述错误的是(C)A派生类可以使用private派生B对基类成员的访问必须是无二义性的C基类成员的访问能力在派生类中维持不变D赋值兼容规则也适用于多继承的组合派生类的构造函数的成员初始化列表中,不能包含(C)A基类的构造函数B派生类中子对象的初始化C基类中子对象的初始化D派生类中一般数据成员的初始化下面(B)的叙述不符合赋值兼容规则A派生类的对象可以赋值给基类的对象B基类的对象可以赋值给派生类的对象C派生类的对象可以初始化基类的引用D派生类的对象的地址可以赋值给指向基类的指针.下列虚基类的声明中,正确的是(B)AclassvirtualB:publicABclassB:virtualpublicACclassB:publicAvirtualDvirtualclassB:publicA.C++设置虚基类的目的是AA消除二义性B简化程序C提高运行效率D减少目标代码
3.2填空题
1、垂直访问时,保护成员的访问控制权限与_公有__成员相同
2、利用继承能够实现_代码复用__这种实现缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量软件
3、派生类对基类的继承有三种方式:__public__、___protected__和___private__
4、多继承情况下,派生类的构造函数的执行顺序取决于__定义__派生类时所指定的各基类的顺序
5、C++提供的_多继承__机制允许一个派生类继承多个基类,即使这些基类是相互无关的
6、派生类可以调用其_定义___中不具备的数据和操作
7、对基类数据成员的初始化必须在派生类构造函数中的__初始化列表___处执行
8、如果类Alpha继承了类Beta,则类Alpha称为__派生__类,类Beta称为__基__类
9、己知下面的程序框架,按注释中的提示补充细节#includeiostream.hclassplanet{protected:doubledistance;___//行星距太阳的距离intrevolve;___//行星的公转周期public:planetdoubledintr{distance=d;revolve=r;}};classearth:publicplanet{doublecircumference;//地球绕太阳公转的轨道周长public://定义构造函数earthdoubledintr,并计算地球绕太阳公转的轨道周长//假定:circumnference=2*d*
3.1416___earthdoubledintr:planetdr{__circumnference=2*d*
3.1416;}___//定义show函数显示所有信息___voidshow{cout”distanceis”distance”milesrevolveis”revolve”days”endl;cou”circumferenceis“circumferenceendl;}___};voidmain{earthob9300000365;ob.show;}
10、设置虚基类的目的是__为了消除二义性__,可通过____virtual_____标识虚基类
11、若多继承时,多个基类中拥有一个同名的成员,则__不能__用调整访问权限确定对该成员的访问
12、根据基类的定义和测试程序,完成下面派生类的定义ClassPoint{public:PointintI=0,intj=0{X=I;Y=j;}voidMoveintxOffintyOff{X+=xOff;Y+=yOff;}intGetX{returnX;}intGetY{returnY;}private:intXY;};classRectangle:privatePoint{public:Rectangleintxintyintwinth__:Pointxy___{_W=w ;H=h ;_}voidMoveintxOffintyOff{_Point:MovexOffyOff;__}intGetX{__returnPoint:GetX;__}intGetY{___returnPoint:GetY;__}intGetW{__returnW;__}intGetH{__returnH;__}private:intWH;}#includeiostream.h#includemath.hvoidmain{Rectanglerect1234;rect.Move56;cout“ThedataofrectXYWH:“rect.GetX“”rect.GetY“”rect.GetW“”rect.GetH“”endl;
13、多继承可以视为是__单继承__的扩展
14、在划线处填上适当的语句,完成下列程序#includemath.hclassPoint{public:pointdoubleadoublebdoublec{_X=a;Y=b;Z=c;__}doubleGetx{returnX;}doubleGety{returnY;}doubleGetz{returnZ;}private:__doubleXY;_____protected:__doubleZ;_____};classLine:_____public____Point{public:Linedoubleadoublebdoublecdoubled_:Pointabc_____{____K=d;___}voidshow{coutGetxendl;coutGety““.endl;coutGetz““Zendl;coutKendl;}private:doublek;};voidmain{Lineobj
1.
23.
45.
67.8;obj.show;}
15、类继承中,缺省的继承方式是__private___
16、当用protected继承从基类派生→个类时,基类的public成员成为派生类的__protected__成员,protected成员成为派生类的_____protected____成员
18、__公有派生__类的对象可作为____基___类的对象处理
19、指向基类的对象的指针变量也可以指向__公有派生类_的对象
20、类之间的”有”关系代表__组合___,”是”关系代表__继承__
3.3简答题A、派生类的定义及其特点B、单继承和多继承的概念及其关系C、继承方式的种类及其各自的特点D、在继承中构造函数和析构函数的调用规则F、赋值兼容原则G、类模板和模板类的含义及其关系
3.4读程序题
1、写出下列程序的运行结果#includeiostream.hclassBase{public:voidWho{coutclassBaseendl;}};classDerived1:publicBase{public:voidWho{coutclassDerived1endl;}};classDerived2:publicBase{public:voidWho{coutclassDerived2endl;}};voidmain{Baseobj1*p;Derived1obj2;Derived2obj3;p=obj1;p-Who;p=obj2;p-Who;p=obj3;p-Who;obj
2.Who;obj
3.Who;}答案classBaseclassBaseclassBaseclassDerived1classDerived
22、写出下列程序的运行结果#includeiostream.hclassinstrument{public:voiddisplayconst{coutinstument::display.endl;}};classpiano:publicinstrument{public:voiddisplayconst{coutpiano::display.endl;}};classguitar:publicinstrument{public:voiddisplayconst{coutguitar::display.endl;}};voidtoneinstrumentI{I.display;};voidmain{guitarguitar1;toneguitar1;pianopiano1;tonepiano1;}答案instument::display.instument::display.
3、写出下列程序的运行结果#includeiostream.hclassA{public:Achari{coutAscons.iendl;}~A{coutAsdes.endl;}};classB:virtualpublicA{public:Bcharicharj:Ai{b=j;coutBscons.jendl;}~B{coutBsdes.bendl;}private:charb;};classC:virtualpublicA{public:Ccharicharj:Ai{coutCscons.jendl;}~C{coutCsdes.endl;}};classD:publicBpublicC{public:Dcharicharjcharkcharscharmcharn:CksBijAiaam{coutDscons.endl;}~D{coutDsdes.endl;}private:Aaa;};voidmain{Dobjabcdef;}答案Ascons.aBscons.bCscons.dAscons.eDscons.Dsdes.Asdes.Csdes.Bsdes.Asdes.类的多态性
4.1选择题.实现运行时的多态性采用DA重载函数B构造函数C析构函数D虚函数.在派生类中重新定义虚函数时,必须在下列哪方面与基类保持一致AA参数类型B参数名字C操作内容D赋值.当一个类的某个函数被说明为virtual时,在该类的所有派生类中的同原型函数AA都是虚函数B只有被重新说明时才是虚函数C都不是虚函数D只有被重新说明为virtual时才是虚函数.通过下述哪一项调用虚函数时,采用动态联编(A)A对象指针B对象名C成员名限定D派生类名下面描述中,正确的是(BD)(两个答案)A虚函数是没有实现的函数B纯虚函数的实现在派生类中C抽象类是没有纯虚函数的类D抽象类指针可以指向不同的派生类对象若一个类中含有纯虚函数,则该类称为(D)A基类B纯基类C派生类D抽象类假设A为抽象类,下列声明(B)是正确的AAfunint;BA*p;CintfunA;DAObj;在C++中,要实现动态联编,必须使用(D)调用虚函数A类名B派生类指针C对象名D基类指针下列函数中,可以作为虚函数的是(CD)(两个答案)A普通函数B构造函数C成员函数D析构函数在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(B)A不同B相同C相容D部分相同下面函数原型声明中,(C)声明了fun为普通虚函数Avoidfun=0;Bvirtualvoidfun=0;Cvirtualvoidfun;Dvirtualvoidfun{};在下面四个选项中(A)是用来声明虚函数的AvirtualBpublicCusingDfalse在下面程序中A、B、C、D四句编译时出现错误的是(C)ClassA______//A{public:______//BA{func;}___//Cvirtualvoidfunc=0;___//D};实现运行时的多态性要使用(D)A重载函数B构造函数C析构函数D虚函数对虚函数的调用(D)A一定使用动态联编B必须使用动态联编C一定使用静态联编D不一定使用动态联编在派生类中重新定义虚函数时除了(D)方面其他方面都必须与基类中相应的虚函数保持一致A参数个数B参数类型C函数名称D函数体关于虚函数的描述中正确的是(D)A虚函数是一个静态成员函数B虚函数是一个非成员函数C虚函数既可以在函数说明时定义也可以在函数实现时定义D派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型下列描述中(D)是抽象类的特性A可以说明虚函数B可以进行构造函数重载C可以定义友元函数D不能说明其对象关于纯虚函数和抽象类的描述中错误的是(C)A纯虚函数是一种特殊的虚函数它没有具体的实现B抽象类是指具有纯虚函数的类C一个基类中说明有纯虚函数该基类的派生类一定不再是抽象类D抽象类只能作为基类来使用其纯虚函数的实现由派生类给出以下(C)成员函数表示纯虚函数Avirtualintvfint;Bvoidvfint=0;Cvirtualvoidvf=0;Dvirtualvoidvfint{}下列关于动态联编的描述中错误的是(D)A动态联编是以虚函数为基础的B动态联编是在运行时确定所调用的函数代码的C动态联编调用函数操作是指向对象的指针或对象引用D动态联编是在编译时确定操作函数的如果一个类至少有一个纯虚函数那么就称该类为(A)A抽象类B虚基类C派生类D以上都不对下面的描述中正确的是(A)Avirtual可以用来声明虚函数B含有纯虚函数的类是不可以用来创建对象的因为它是虚基类C即使基类的构造函数没有参数派生类也必须显示调用其构造函数D静态数据成员可以通过成员初始化列表来初始化
4.2填空题
1、在析构函数中调用虚函数时采用__静态__联编
2、动态联编是在__虚函数___的支持下实现的它通过__指针或引用__来调用该函数操作
3、动态联编中直到__程序运行__时才能确定调用哪个函数:而静态联编则是在__程序编译__时进行的
4、C++中__不支持__虚构造函数但___支持___虚析构函数
5、静态联编所支持的多态性称为__编译时__多态性动态联编所支持的多态性则称为___运行时___多态性动态多态性由___虚函数___来支持
6、在类定义中将___=0__置于虚函数的函数原型的末尾可以将该函数声明为纯虚函数
7、下列程序的运行结果如下:Basescons.Derivedscons.Derivedsdes.Basesdes.根据结果将程序补充完整#incudeiostream.hclassBase{public:Base{coutBasescons.endl;}__virtual~Base__{coutBasesdes.endl;}};classDerived:publicBase{public:Derived{coutDerivedscons.endl;}~Derived{coutDerivedsdes.endl;}};voidmain{Base*Ptr=__new_Derived_deleteptr;}
8、抽象类不能__定义对象但可以_声明指针或引用__作为参数类型函数返回类型或显式转换类型
9、根据不同的输出结果在函数Tone中填入正确的语句#includeiostream.hclassInstrument{public:virtualvoidPrintconst{coutInstrument:Printendl;}};classPiano:publicInstument{public:voidPrintconst{coutPiano::Printendl;}};classGuitar:publicInstruIment{pub1ic:voidPrintconst{coutGuiur::Printendl;}};voidTone__Instrumentobj__//第二个要求改成Instrumentobj{__obj.print;__}voidmain{Guitarg;Toneg;Pianop;Tonep;}1输出结果为:Instrument::PrintInstrument::Print2输出结果为:Guitar::PrintPiano::Print
10、对虚函数使用对象指针或引用调用系统使用__动态__联编:使用对象调用时系统使用__静态__联编
11、将下列程序补充完整#includeiostream.hclassconvert{public:convertdoubleI{va11=I;}____virtualvoidcompute=0;____protected:doubleval1;doubleva12:};//literstogallonsclassl_to_g:publicconvert{public:__l_to_gdoubleI:convertI{}____voidcompute{va12=va11/
3.7854;coutva11litersisval2gdIons.endl;}};//FahrenheittoCelsiusclassf_to_c:publicconvert{public:f_to_cdoubleI:convertI{}voidcompute{va12=va11-32*5/9;coutva11“Fahrenheitis”va12“Celsius.”endl;}};voidfun__convertf____{f.compute;}voidmain{l_to_glgobj4;f_to_cfcobj70;funlgobj;funfcobj;}
12、下列程序的运行结果如下:Derive1sPrintcalled.Derive2sPrintcaIIed.根据结果将程序补充完整#includeiostream.hclassBase{public:BaseintI{b=I;}__virtualPrint=0;____protected:intb;}classDerive1:publicBase{public:__Derive1intI:BaseI{}___voidPrint{coutDerive1sPrintcalled.endl;}};classDerive2:publicBase{public:Derive2intI:BaseI{}voidPrint{cout“Derive2’sPrintcalled.”endl;}};voidfun__Base*obj____{obj-Print;};voidmain{Derive1*d1=newDerive11;Derive2*d2=newDerive22;fund1;fund2;}
13、在一个成员函数内调用一个虚函数时对该虚函数的调用进行_动态__联编
14、带有__纯虚函数__的类称为抽象类它只能作为__基类__来使用
4.3简答题A、成员函数重载与虚函数的区别B、静态联编和动态联编的含义C、纯虚函数和抽象类的定义及其关系D、抽象类的特点
4.4读程序题
1、写出下列程序的运行结果#includeiostream.hclassBase{public:Baseinti{x=i;coutBase:xendl;}virtual~Base{cout~Base:xendl;}private:intx;};classDerived:publicBase{public:Derivedintiintj:Basei{y=j;coutDerived:yendl;}~Derived{cout~Derived:yendl;}private:inty;};voidmain{Base*b1=newBase15;deleteb1;Base*b2=newDerived2025;deleteb2;}答案Base:15~Base:15Base:20Derived:25~Derived:25~Base:
202、阅读下列程序回答后面提出的问题#includeiostream.hclassBase{public:Base:x0y0{}BaseintIintj:xIyj{}intGetXconst{returnx;}intGetYconst{returny;}virtualvoidPrintconst{coutx=xy=yendl;}virtual~Base{Print;}private:intxy;};classDerived:publicBase{public:Derived:z0{}DerivedintIintjintk:BaseIjzk{}voidPrintconst{coutx+z=Base::GetX+zy+z=Base::GetY+zendl;}~Derived{Print;}private:intz;};voidmain{Base*d1=newDerived;d1-Print;Base*d2=newDerived102030;d2-Print;deleted2;deleted1;}答案x+z=0y+z=0x+z=40y+z=50x+z=40y+z=50x=10y=20x+z=0y+z=0x=0y=
03、阅读下列程序回答后面提出的问题#includeiostream.hclassVehicle{public:voidSetColorintc{color=c;}virtualvoidMove{coutVehiclemoving.endl;}private:intcolor;};classCar:publicVehicle{public:voidMove{coutCarmoving.endl;}};classBus:publicVehicle{public:voidMove{coutBusmoving.endl;}};classSportsCar:publicCar{};classCoupe:publicCar{public:voidMove{coutCoupemoving.endl;}};voidmain{Vehicle*vec;vec=newCar;vec-Move;deletevec;vec=newBus;vec-Move;deletevec;vec=newSportsCar;vec-Move;deletevec;vec=newCoupe;vec-Move;deletevec;}答案Carmoving.Busmoving.Carmoving.Coupemoving.运算符重载
5.1选择题友元运算符objobj2被C++编译器解释为(A)Aoperatorobj1obj2Bobj1obj2Cobj
2.operatorobj1Dobj
1.opratorobj2下面对C++运算符的正确的描述是(D)A只有类成员运算符B只有友元运算符C只有非成员和非友元运算符D上述三者都有下列关于C++运算符函数的返回类型的描述中错误的是(C)A可以是类类型B可以是int类型C可以是void类型D可以是float类型重载赋值操作符时应声明为(C)函数A友元B虚C成员D多态在一个类中可以对一个操作符进行(D)重载A1种B2种以下C3种以下D多种下列关于运算符重载的描述中正确的是(D)A运算符重载可以改变运算符的操作数的个数B运算符重载可以改变优先级C运算符重载可以改变结合性D运算符重载不可以改变语法结构下列运算符中(C)运算符在C++中不能重载A=BC::Ddelete下列运算符中(A)运算符在C++中不能重载A〕:B[]CnewD在重载运算符函数时下面(D)运算符必须重载为类成员函数形式A+B-C++D-下列运算符不能用友元函数重载的是(B)A+B=C*D下面对友元的错误描述是(D)A关键字friend用于声明友元B一个类的成员函数可以是另一个类的友元C友元函数访问对象的成员不受访问特性影响D友元函数通过this指针访问对象成员.如果类A被说明成类B的友元,则(C)A类A的成员即是类B的成员B类B的成员即是类A的成员C类A的成员函数可以访问类B的所有成员D类B的成员函数可以访问类A的所有成员.在C++中不能被重载的一组运算符是(A)A:::.sizeofB:.sizeof++-C:::newdeleteD++--:sizeof
5.2填空题
1、要在类的对象上使用运算符,除了运算符__=__和____以外,其他的运算符都必须被重载
2、在C++中只能重载为类的成员函数的运算符是___=__、__()__、__[]__、_-__
3、运算符与运算符[]必须重载为__类的成员函数___
4、利用成员函数对二元运算符重载其左操作数为__this指针指向的当前对象__右操作数为__成员函数参数__
5、下列程序定义了一实部为mal虚部为imag的复数类complex并在类中重载了复数的+、-操作请将下列程序补充完整ClassComplex{public:Complexdoubler=
0.0doubleI=
0.O{__real=r;imag=I;___}__Complex__operator+Complex;__friendComplex____operator-ComplexComplex;private:doublerealimag;};___ComplexComplex::operator+Complexc{returnComplex__real+c.realimag+c.imag___;};___Complex___operator-Complexc1Complexc2{returnComplex___c
1.real-c
2.realc
1.imag-c
2.imag____;}
6、单目运算符作为类成员函数重载时__没有__的参数;双目运算符作为__类成员函数__重载时需声明其右操作数作为_友元函数__重载时需声明全部操作数
7、重载运算符函数的函数名时使用关键字_operator___
8、重载的运算符仍然保持其原来的优先级、__结合性__和__语法结构__
9、为满足运算符+的可交换性必须将其重载为_友元函数___
10、C++中不能重载的运算符有__.__、__*取内容__、__::__、__:__和__sizeof__
11、设a和b是两个整型变量a+b表示这两个变量的和:设c和d为浮点型变量c+d也表示这两个变量的和这里的运算符+具有不同的用途这是__运算符重载___的例子
5.3简答题A、友元的特点B、运算符重载的含义C、运算符重载的限制
5.4读程序题
1、写出下列程序的运行结果#includeiostream.hclassRect{public:Rectintlintw{length=l;width=w;}voidPrint{coutArea:length*widthendl;}Rectoperator*intd{returnRectlength*dwidth*d;}private:intlengthwidth;};voidmain{Rectp54m00;m=p*4;m.Print;}答案Area:
3202、写出下列程序的运行结果#includeiostream.hclassVector{public:Vector{}Vectorintiintj{x=i;y=j;}friendVectoroperator+=Vectorv1Vectorv2{v
1.x+=v
2.x;v
1.y+=v
2.y;returnv1;}Vectoroperator-=Vectorv{Vectortemp;temp.x=x-v.x;temp.y=y-v.y;returntemp;}voiddisplay{coutxyendl;}private:intxy;};voidmain{Vectorv112v234v3v4;v3=v1+=v2;v4=v1-=v2;coutv1=;v
1.display;coutv2=;v
2.display;coutv3=;v
3.display;coutv4=;v
4.display;}答案v1=12v2=34v3=46v4=-2-
23、写出下列程序的运行结果#includeiostream.hclassCoord{public:CoordintI=0intj=0{x=I;y=j;}voidPrint{coutx=xy=yendl;}friendCoordoperator++Coordop;friendCoordoperator++Coordopint;private:intxy;};Coordoperator++Coordop{++op.x;++op.y;returnop;}Coordoperator++Coordopint{++op.x;++op.y;returnop;}voidmain{Coordobj12obj258;obj.Print;++obj;obj2++;obj.Print;obj
2.Print;}答案x=1y=2x=1y=2x=6y=9。