2023年面向对象程序设计复习题.docx
一、单项选择题。1引入内联函数的重要目的是A)缩短程序代码,少占用内存空间B.既可以保证程序的可读性,又能提高程序的运营效率C)提高程序的执行速度D)使程序的结构比较清楚2重载函数是A)以函数参数来区分,而不用函数的返回值来区分不同的函数B.以函数的返回值来区分,而不用函数参数来区分不同的函数C)参数表完全相同而返回值类型不同的两个或多个同名函数D)参数表和返回值类型都必须是不同的两个或多个同名函数 3有函数原型vo i d fun2 (i n t *),下面选项中,对的的调用是A) d o u b le x = 2 . 17; f u n 2 (&x); C) int a = 15; f u n 2 (a*3. 1 4);B)in t b = 1 00;fun2 (& b);D) fun2(25 6 );4在C+中,要实现动态联编,必须使用()调用虚函数。A)类名 B)派生类指针 C)对象名加)基类指针5在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不对的的是A)派生类的对象可以直接访问基类中的所有成员B)派生类的对象可以初始化基类的引用C)派生类的对象可以赋给基类的对象D)派生类的对象的地址可以赋给指向基类的指针6设立虚基类的目的是A)消除两义性O提高运营效率A)消除两义性O提高运营效率B)简化程序D)减少目的代码);cla s s Der i v ed:pu b lie B asepub 1 ic:void fun 1 ()cout<<"D e rived"«endl;)void fun 2()c o u t<<HDe r i ved"« end;;void f(B ase &b) b. fun 1 (); b.f u n2 () ;in t ma i n ()(D e r ive d obj;f(obj);r e tur n 0;)执行这个程序的输出结果是A)Base 。B )Ba s e。D erived D ) Der i ve dBas e o。D e r ived a se Derived26有如下类声明:c 1 ass SAMPLEint n;p u b 1 ic:SAM P LE (i n t i = 0 ): n (i) v oid s etVa 1 ue (in t nO);下列关于se t Va 1 u e成员函数的实现中,对的的是A)SAM PLE:setVal u e(in t n 0 )n = nO;B)void S AMPLE : :setV a 1 ue(int nO)n = n 0;C)void set Valu e (i n t n ()n = nO;D) s e t V a I u e ( i nt nO)n = nO;2 7 .下列函数模板的定义中,合法的是()oA. templa t e <t y p e name T> T a b s (T x) ret u r n x<0? x: x;t e mplat e class <T> T a bs ( T x) return x< 0 ?- x : x;B. templat e T < t ypcn a me T> abs(T x) re t ur n x < 0 ? x:x;t e mplate T a bs(T x) retur n x < 0 ? -x: x; 28.下列程序的运营结果为()o# include <i o str e a m > class BASE pu b lie:BASE (in t i) co u t V V调用基类BAS E的构造函数:” i<<endl; ;class A : p u blie BASEpublic:A (int a, int b) : BASE (a), bl (b)c o ut 。”调用派生类A的构造函数:“a+bVVendl; pr i vate:BASE b 1 ;;vo i d inain()A obj (1, 2);A.调用基类BASE的构造函数:2-B)调用基类BASE的构造函数:1调用基类BASE的构造函数:1调用基类BASE的构造函数:2调用派生类A的构造函数:3。调用派生类A的构造函数:3C)调用基类BASE的构造函数:2财 调用基类BASE的构造函数:1调用派生类A的构造函数:3。调用基类BASE的构造函数:32 9.下列程序的运营结果为()0# i n clude< i ostream. h > cl a ss T p ublic:T( int x) a=x; b+= x ; ; stat i c void di s play ( T c) c o u t V V " a=" «c. a V U t ' «v b =w «c. b«endl;p r i vate:i nt a;static int b;;in t T:b=5;void main () T A (3),B(5); T : :d i s p la y (A);T: :display (B);)A) a=3 b =83 B) a =3 b = 5a= 5b=10。a=5 b= 5C . a =3 b=l 3 o oD) a= 3b=8a=5 b= 1 3 >a = 5b=1330.下面程序中对一维坐标点类Poi n t进行运算符重载# i nclu d e <iostre a m >using n am e s p ace s t d;cla s s p oint(public:p oint ( i nt val) x=val;po i nt& ope rat or+() x+;re t u m*th i s; point oper a tor+ (int) p oint o ld=*t h i s, +(*this) ; retum old; int GetX() c o nst r etum x ;private:int x ;;int mainO(point a( 1 0 );cout<<(+ + a) .GetX ();c out<<a+. GetX ();r e t u m();编译和运营情况是A)运营时输出10 11C)运营时输出1112编译和运营情况是A)运营时输出10 11C)运营时输出1112B)运营时输出1111D)编译有错二、填空题。1程序中有如下语句for(i n t i = 0; i< 5 ; i+) co u t <V * (p +可以依次输出int型一维数组DATA的前5个元素。由此可知,变量p的定义及初始化语句是o2若下面程序运营时输出结果为1,A, 10. 12, B, 3.5请将程序补充完整。,#includeusing name s pace std;int m a in ()(v o id t e s t(int, cha r ,doubl e );test(l/ A' ,10. 1 );test( 2 ,B);retu r n 0;voi d t e s t ( i nt a, char b, dou b 1 e c )cou t<<a<<n,"<<b«""« c «e nd 1 ;3有如下类声明:c 1 ass MyClassi nt i ;priva t e: i n t j;p rote c te d :int k;p u blic:in t m, n;);其中,私有成员的数量为 o4 有如下程序:# i nc 1 u deusing n amespac e std;c lass ONE(p u b 1 i c :v i r t ual void f() cout« " 1 " ;);cl a ss TW 0 :p u blic ONE(p u bl i c:TWO ()cout« “ 2 " ;cl a ss THREE: pu b 1 i c TWO(publ i c:vi r tual vo i d f() TWO:f() ; c o ut«"3 " ;int main()ONE aa,* p;TWO bb;THREE c c;p = &cc;p->f();ret u r n 0;执行上面程序的输出是 5有如下程序:# i n clud eus i n g n am e s pac e std;c 1 ass PA RENTp u bli c :PARENT() cou t «nPARENT n ;卜class SON:pu blic PARENT(p ub 1 ic:SON () cout«"SON ” ;i n t m a in()S ON s on;PARENT*p;p = &son;ret u m 0;)执行上面程序的输出是 o6若以非成员函数形式,为类Bounce重载”运算符,其操作结果为一 boo 1型数据, 则该运算符重载函数的原型是 o7下面是复数类comp lex的定义,其中重载的运算符的功能是返回一个新 的复数对象,其实部等于两个操作对象实部之和,其虚部等于两个操作对象虚部 之和;请补充完整:c I a ss compl e x(do u bl e real; / / 实部d o uble imag; / /虚部pubi i c:complex(doub 1 e r, d oubl e i ) :real(r),im a g(i) c omplexoperator+(c ompl e x a) return com p lex():);8已知一个函数模板定义为tcm p 1 ate T1, typ e n a me T2>T 1 FUN(T2 n) re t urn n * 5 . 0 ;若规定以i n t型数据7为函数实参调用该模板函数,并返回一个double型数据,则该调用应表达为。9.设有数组和指针变量定义为:in t a23 = l, 2 ,3, 4, 5) ), *p=&aO 2;则表达式* (p+1)的值为:o.有字符数组和字符指针定义:char si 口二" string",char s2=" c har” ; char *co n s t ps=sl;则使用指针p s进行操作时,可以改变p s ,但不能改变10 .设Cat是已定义的类,整型变量a是Cat类的公有成员变量,P是Cat类的对 象指针,且已指向Cat类的对象c,则用指针p给整型成员变量a赋值5的语句 为:O1 2.在C + +语言中,运算符可以重载,运算符重载实质上就是函数的重载,运算 符重载实现的多态性属于:o13.在C+语言中,运算符可以重载,运算符重载实质上就是函数的重载,设后置 运算符“+”在类A的定义中被重载为成员函数,则对A类对象a作运算a+,与 该运算表达式等价的函数调用形式为:o1 4.当保护继承时,基类的 成员在派生类中成为保护成员,不能通过派生类的对象来直接访问该成员。1 5 .在类中,成员为类的所有对象所共享。1 6.假如使用数组名作为函数参数,形实结合时,传递的是.有如下定义:c lass MA(n t v alue;publi c :MA (int n =O):val u t ( n );MA* t a, t b; a其中MA类的对象名标记符是.若将一个二元运算符重载为类的成员函数,其形参个数应当是 个。17 .有如下程序:# i nc 1 u de<io s tream>usi n g nam e s p ace s t d;c 1 as s DA1 n t k;pub 1 ic:DA(int x =1) : k (x) DA() cout<<k ; );int ma i n() DA d = DA ( 3),DA(3) , DA (3) ;DA* p=n e w DA 2 ;dele t e p ;r e t u r nO;7关于构造函数,以下说法错误的是A)构造函数的作用是在对象被创建时使用特定的值构造对象,或者说 将对象初始化为一个特定的状态。在对象创建时由系统自动调用。B)基类的构造函数可以被派生类所继承。0假如程序中未声明,则系统自动产生出一个缺省形式的构造函数。D)允许为内联函数、重载函数、带缺省形参值的函数。8下列关于C+函数的说明中,对的的是A)内联函数就是定义在另一个函数体内部的函数B)函数体的最后一条语句必须是return语句C)标准C+规定在调用一个函数之前,必须先声明其原型D)编译溶会根据函数的返回值类型和参数表来区分函数的不同重载形 式9由于常对象不能被更新,因此A)通过常对象只能调用它的常成员函数B)通过常对象只能调用静态成员函数C)常对象的成员都是常成员D)通过常对象可以调用任何不改变对象值的成员函数1()下列关于虚函数的说明中,对的的是A)从虚基类继承的函数都是虚函数 B)虚函数不得是静态成员函数C)只能通过指针或引用调用虚函数 D)抽象类中的成员函数都是虚函 数11运算符重载是对已有的运算符赋予多重含义,因此A)可以对基本类型(如ini类型)的数据,重新定义运算符的含义B)可以改变个已有运算符的优先级和操作数个数C)只能重载C+中已有的运算符,不能定义新运算符这个程序的输出结果是 O20. C+语言中的多态性分为编译时的多态性和 时的多态性。三、简答题。1 .什么叫做友元函数,什么叫做友元类?2 .什么叫做多态性,面向对象的多态性可以分为哪四类?3 .什么叫做作用域? C +中有哪几种类型的作用域?4 .对比简述C语言中函数内静态局部变量与C+中类的静态成员变量的特点。5 .简述用虚函数实现动态多态性的三个关键之处。6 .什么是内联函数,它有哪些特点?7 .列出拷贝构造函数被调用的三种情况。8 .比较类的三种继承方式public、pro tected> privat e之间的差别。9 .什么是虚基类?有何作用?10 .什么是编译时的多态?具体涉及哪些类型?1 1.函数模板与函数重载有哪些区别?12.构造函数与析构函数有什么作用?四、综合编程题。1 .函数编程:定义一函数模板s wap,它能实现x、y值的互换,在m a in函数中用任意 两个整数、两个浮点数分别使用这个函数模板。2 .函数编程:定义一函数void C o n t r aryStr ( c har * str),它能实现字符串 的逆序输出,在main函数中用任意字符串测试该函数。3 .类编程:定义一个表达工人的类Worker,有两个普通数据成员工龄a g e和工资pay ,有一个静态成员人数sum;定义一个有二个参数的构造函 数,给age和pay赋值,令sum+;给s urn初始化为0,定义一个静态成 员函数g e tsum,用于获得sum的值;在m a in函数中以不同的方式定 义二个工人对象,分别用二个对象和类名3种方式调用g etsum函数并输 出相应人数。4 .派生类和虚函数编程:(1)定义一个抽象类Shap e,并且提供二个纯虚函数:计算并返回面积 函数rcArca及计算并返回体积函数r cVolumeo(2)由S h a pe类派生Cu b e(正方体)类,它涉及私有数据成员Ie n g th (边长),还包含构造函数和两个纯虚函数的实现。(3)由S hape类派生B a 1 1 (球形)类,它涉及私有数据成员radius (半径),也包含构造函数和两个纯虚函数的实现。(注:球表面积公式=4 n R2,球体积公式二(4n/3)R3 )o(4)在main函数中创建矩形类、球类对象存入一个s h叩e类指针数 组中,通过for循环将数组中各类图形的面积及体积输出。(3() 分)5 .运算符重载编程:(1)设计一个简朴分数类F ens h u,其包含两个整数的类数据成员分 子fenzi、分母fen mu,定义并实现一个有两个整数作参数的 构造函数,并定义一个普通成员函数s h ow(),它能以ufenzi/fenmu格式输出分数;(2)用成员函数方式重载+运算符,用友元函数方式重载-运算符,实 现分数类的+和-运算。(3)在main函数中使用Fenshu类和二个重载运算符进行+和-运算, 并调用s h ow ()函数进行输出。D) C +中已有的所有运算符都可以重载12模板对类型的参数化提供了很好的支持,因此A)类模板的重要作用是生成抽象类B)类模板实例化时,编译器将根据给出的模板实参生成一个类C)在类模板中的数据成员都具有同样类型D)类模板中的成员函数都没有返回值13下列符号中可以用作C+标记符的是A)_radi u sB )foobar14下列语句中,错误的是A)c o nst int b u ffe r =256;C) c o ns t double * p oint;ble (5.5);15有如下程序:i n t x = 3;dox -= 2;c o u t «x;)while(! (-x);执行这个程序的输出结果是A)1 B) 3 06有如下程序:# inclu d e <iost r e am >u s ing n a me s p a ce std;int main()C)else D) 3 roomB)const int t e mp;D) c o n st dou b 1 e *rt =ne w d ou1 -2 D)死循环i n t *p;*p = 9;c o u t<<HT h e val u e at p:"vV*p;ret u rn 0;编译运营程序将出现的情况是A)够编译时出现语法错误,不能生成可执行文献B)运营时一定输出:The va 1 ue at p:9C)运营时一定输出:Thev a lue at p: *9D)运营时有也许犯错17有如下程序:# i nclude < i ostr e am>u s i ng namesp ace std;in t mai n ()(void functi o n(doubl e va 1 );d oub 1 e va 1 ;f unction(va 1 );c o ut«val;return 0;v o id fun ctio n (double v al)(val = 3 ;编译运营这个程序将出现的情况是A)编译犯借,无法运营B)输出:3C)输出:3.018有如下类定义:D)输出一个不拟定的数clas s A A(i n t a;p u blic:int g et R ef() c o nst r e tu r n & a ; i n t getVa 1 u e () c o n s tret u r n a; /voi d set (int n)c o n sta= n ; f rie n d vo i d show(AA a a ) const cout<<aa; /®;其中的四个函数定义中对的的是A)©B)C)(3)D)19有如下程序:# inclu d e < i os t r eam>u sing n a mes p ace s t d;class B a se(public:void f u n() cou t «"Base: : f un"«endl;;c 1 as s Derived: p ublic Base(publi c :vo i d f u n ()co u t«"Deri v e d: :fun"«endl;);i n t mai n ()(Deri ved d ;d. fun(); return 0;已知其执行后的输出结果为:Base:fu nDe r ived:: fun则程序中下划线处应填入的语句是A) B a s e.fun() ; B) Ba s e: :fu n () C) Bas e ->fun() D)fu n ();20下面是重载为非成员函数的运算符函数原型,其中错误的是A) F raction op e rat o r + ( F r act ion, Fraction);B ) F r ac t i on op e r ator - (Fra c tion);C)Fraction& o pc r ator = (Fracti o n&, Fractio n );D)F r action& oper a t o r += (F racti o n&, F r actio n );21有如下类定义:cl a ss F o o(p ublic:Foo(int v ) : v a 1 ue(v) / /Foo () p r iva t e :Foo () int value = 0; /©;其中存在语法错误的行是A)©出)©必2 2有如下类定义:c 1 ass Pointint x_, y_;pub 1 ic:Point() :x_(0) , y_ ( 0 ) )Poin t ( i n t x, int y = 0 ): x_(x),y_( y );若执行语句Poin t a( 2 ) , b 3, * c E 4 ;则Poi n t类的构造函数被调用的次数是A ) 2次 B)3次C ) 4次 D)5次2 3有如下程序:#in elude <io s t r e am>us i ng namesp ace std;class Apub 1 ic:A() cout«nAn;)A ()cout<v"A"B:pu b 1 ic Aclas s(A* p ;p u bl i c:B()cou t <<nB" p = new A(); B()cou t <<"-B " ; d e lete p ;;int ma i n()B ob j ;ret urn 0;执行这个程序的输出结果是A)B A AABA。B)ABABAAC) B A ABAA oD) A BAABA24有如下程序:# i n c 1 ude <i o stream>u sin g namespac e std;c lass Ba s e(p r i v a te:void f unl() co n stcou t <<nf u nl"pr o tec ted:v o id f u n 2 () const co u t«nfun2n;pub 1 ic:v o id f u n3() cons t cout« " fun3n;j;cla s s Derived: protecte d B a se(pu b lie:v o id f u n 4() co n s t co ut« " fu n 4";i nt main()(Derived obj;o bj.f u nl (); / /obj.fun2(); obj . fun3(); ob j .fun 4 (); IIre t u r n 0;其中有语法错误的语句是A)-B)C)D )2 5有如下程序:#i n cl u de <iostrcam>using namespace std;c la s s Base(p u blic:void f u n 1 ()cout«"Ba s e "«endl;v i r t ual v o id fun2() cout«n B a s e"«endl;)