华为C++笔试题最全演示教学.doc
Good is good, but better carries it.精益求精,善益求善。华为C+笔试题最全-脚本执行失败问题1.虚函数是可以New一个对象的时候要根据虚函数的函数体来填虚表;而内联函数没有函数体,只是在预编译阶段展开内联的,这样就可以减少函数调用的开销,提高效率(错误)2.一个类里可以同时存在同一个类里无论什么函数都不能函数名和参数完全一样参数和函数名都相同的虚函数与静态函数(错误)3.父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)特殊情况,参见题5,会调用父类的析构函数(正确)/任何情况下删除子类都会调用到父类的析构函数4对于下面的类CA,sizeof(CA)=_B_:A.4B.8C.12D.16classCApublic:CA();virtualCA();/因为有虚函数,所以会有4个字节的虚表指针private:intm_iTime;/成员变量4个字节public:intGetTime();intSetTime(intiTime);5下面这段程序,打印结果是_A_:A.1B.2C.3D.以上都不对intg_iCount=0;classCParentpublic:CParent()CParent()g_iCount+=1;classCSon:publicCParentpublic:CSon()CSon()g_iCount+=2;main()CParent*p=newCSon();deletep由于p被声明成父类指针,并且父类和子类的析构函数都非虚,因此delete操作只能根据p指针声明的类型来调用父类的析构函数;std:cout<<g_iCount<<std:endl;6请问下面这段程序的输出结果是_A_:A.2,1,B.2,2,C.1,1,D.1,2,classCParentpublic:CParent()virtualCParent()public:virtualvoidPrint()std:cout<<"1,"classCSon:publicCParentpublic:CSon();virtualCSon();public:voidPrint()std:cout<<"2,"voidTest1(CParent&oParent这里是引用了一个外部对象,该对象的虚表不会发生变化)oParent.Print();voidTest2(CParentoParent这里会在栈空间内重新构造一个CParent类的对象,如果传入实参的类型与CParent不同则虚表会发生变化)oParent.Print();main()CSon*p=newCSon();Test1(*p);/这里只是一个引用Test2(*p);/这里会在栈空间重新构造Cparent类对象deletep;7请问下面这段程序的输出结果是_D_:A.2,1,B.2,2,C.1,1,D.1,2,classCParentpublic:CParent()virtualCParent()public:voidPrint()std:cout<<"1,"classCSon:publicCParentpublic:CSon()virtualCSon()public:voidPrint()std:cout<<"2,"main()CSonoSon;CParent*pParent=&oSon;CSon*pSon=&oSon;pParent->Print();pSon->Print();由于父类和子类的Print函数都非虚,所以根据指针类型决定调用关系8请问下面这段程序的输出结果是_C_:A.2,1,B.2,2,C.1,2,D.1,1,classCParentpublic:CParent()Print();virtualCParent()public:virtualvoidPrint()std:cout<<"1,"classCSon:publicCParentpublic:CSon()Print();virtualCSon()public:voidPrint()std:cout<<"2,"main()CParent*pParent=newCSon()类的构造过程遵循压栈原则,构造过程中虚表尚未建立成功,是静态调用虚函数;deletepParent;9请问下面这段程序的输出结果是_D_:A.2,2,B.2,C.输出结果不确定D.以上都不对classCParentpublic:CParent()Print();构造子类对象时调用到父类的构造函数,但父类的Print函数是纯虚的,没有实现,所以这里的调用不成功,编译会出错virtualCParent()public:virtualvoidPrint()=0;classCSon:publicCParentpublic:CSon()Print();virtualCSon()public:voidPrint()std:cout<<"2,"main()CParent*pParent=newCSon();deletepParent;10请仔细阅读以下程序:classBasepublic:virtualbooloperator=(intiValue)std:cout<<"IamBaseclass!"<<std:endl;returntrue;virtualBase();classDerive:publicBasepublic:virtualbooloperator=(intiValue)std:cout<<"IamDeriveclass!"<<std:endl;returntrue;virtualDerive();intmain()Derivederive;Base*pBase=&derive;Derive*pDerive=&derive;*pBase=0;*pDerive=0;重载操作符声明为virtual使操作符产生多态性return0;程序的输出结果是_B_:A、IamBaseclass!Iambaseclass!B、IamDeriveclass!IamDeriveclass!C、Iambaseclass!IamDeriveclass!D、IamDeriveclass!IamBaseclass!11请仔细阅读以下程序:classBasepublic:virtualvoiddisplay(std:stringstrShow="IamBaseclass!")std:cout<<strShow<<std:endl;virtualBase();classDerive:publicBasepublic:virtualvoiddisplay(std:stringstrShow="IamDeriveclass!")std:cout<<strShow<<std:endl;virtualDerive();intmain()Base*pBase=newDerive();Derive*pDerive=newDerive();pBase->display();pDerive->display();由于这两处调用display函数使用了默认参数,而默认参数是通过指针类型来确认的deletepBase;deletepDerive;return0;程序的输出结果是_C_:A、IamBaseclass!Iambaseclass!B、IamDeriveclass!IamDeriveclass!C、Iambaseclass!IamDeriveclass!D、IamDeriveclass!IamBaseclass!12请仔细阅读以下程序:classBasepublic:virtualvoiddisplay()const这个const将隐含的this指针声明成const类型,所以相当于父类和子类的display函数具有不同的参数,也就是说子类遮蔽了display函数,此处不具有多态性std:cout<<"IamBaseclass!"<<std:endl;virtualBase();classDerive:publicBasepublic:virtualvoiddisplay()std:cout<<"IamDeriveclass!"<<std:endl;virtualDerive();intmain()Base*pBase=newDerive();Derive*pDerive=newDerive();pBase->display();pDerive->display();deletepBase;deletepDerive;return0;程序的输出结果是_C_:A、IamBaseclass!Iambaseclass!B、IamDeriveclass!IamDeriveclass!C、Iambaseclass!IamDeriveclass!D、IamDeriveclass!IamBaseclass!13在C+中,多态性存在于_B_:A、同一个类的多个同名函数之间B、子类继承层次中C、父类的多个同名函数之间D、以上都不是14下面黑体加粗的语句存在问题,请问下面的修改哪个是正确的?BclassApublic:voidFunc();.;classBprivate:boolFunc()const;注意这里是私有的哦.;classC:publicA,publicB.;/classdefinitionisunimportantCtest;test.Func();/lookhereAtest.B:Func();Btest.A:Func();C、D语法错误,A中B:Funs()是私有的不可访问CB:test.Func();DA:test.Func();15判断:子类可以访问父类保护成员,子类的友元类也可以子类可以访问的,其友元都可以访问通过子类对象去访问父类的保护成员。(正确)16.下面对protected继承的描述正确的是:C/注意这里是保护继承A父类的友元类可以访问子类保护成员B子类的友元类可以访问父类的私有成员C子类可以访问父类的保护成员此时父类的所有成员都是子类的保护成员(不包括父类的私有成员)D父类可以访问子类的保护成员17对于下面的代码,描述正确的是:AclassApublic:virtualvoidtest();classB:publicApublic:voidtest();.;classC:publicBpublic:voidtest();.;AB类的test函数是虚函数,而C类的也是BB类的test函数不是虚函数CB类的test函数是虚函数,而C类的不是DC类的test函数不是虚函数18请指出如下程序的输出结果:D#include<iostream.h>classbasepublic:base()cout<<"base()"base()cout<<"base()"classsubs:publicbasepublic:subs()cout<<"subs()"subs()cout<<"subs()"voidmain()subss;就是子类构造的压栈原则Asubs()base()subs()base()Bbase()subs()base()subs()Csubs()base()base()subs()Dbase()subs()subs()base()19请指出如下程序的输出结果:B#include<iostream.h>classApublic:intn;classB:publicA;classC:publicA;classD:publicB,publicC注意这里的继承顺序决定了在内存种B:n在C:n的前面;voidmain()Dd;d.B:n=10;d.C:n=20;cout<<d.B:n<<","<<d.C:n;A20,20B10,20C20,10D10,1020判断题:友元(friend)没有破坏类的封装。错误21下面哪种说法是正确的:BA.派生类从基类public派生,派生类可以直接访问基类private的成员变量和成员函数。B.派生类从基类public派生,派生类可以直接访问基类protected的成员变量和成员函数。C.派生类从基类public派生,外部可以直接访问派生类中基类部分protected的成员变量和成员函数。D.派生类从基类protected派生,外部可以直接访问派生类中基类部分public的成员变量和成员函数。22下面哪种说法是不正确注意这里是不正确的说法的:DA.外部对象不能直接访问类private的成员变量和使用private的成员函数。B.外部对象不能直接访问类protected的成员变量和使用protected的成员函数。C.外部对象可以直接访问类public的成员变量和使用public的成员函数。D.友元(friend)不能直接访问类的private的成员变量和使用private的成员函数。23下面那个不是类成员访问限定符:DA.publicB.privateC.protectedD.friend24请阅读下面程序片断,成员函数setName的访问限定是什么?Astruct结构的缺省权限是public类的缺省权限是privateManvoidsetName(conststd:string&strName);voidsetAge(unsignedintiAge);std:stringgetName()const;unsignedintgetAge()const;private:unsignedintm_iAge;std:stringm_strName;A.publicB.privateC.protectedD.friend25下面说法是否正确?错误存在下面重载函数声明:1)voidmyfunc(chara);2)voidmyfunc(longb);则下面调用的代码匹配第一个函数编译不通过intc=100;myfunc(c);26下面哪种情形下myfunc函数声明是重载重载仅关注函数名和参数类型?CA.intmyfunc(inta,doubleb)和doublemyfunc(inta,doubleb)B.intmyfunc(inta,doubleb)和intmyfunc(inta,doubleb=0.5)C.intmyfunc(inta,doubleb)和intmyfunc(doubleb,inta)D.intmyfunc(inta,doubleb)和doublemyfunc(int,double)27下面那种情形下myfunc函数声明是重载?BA.namespaceIBM/两个名字空间中各有一个myfunc函数intmyfunc(inta);namespaceSUNintmyfunc(doubleb);B.namespaceIBMintmyfunc(inta);namespaceSUNusingnamespaceIBM;intmyfunc(doubleb);SUN中发生了重载C.namespaceIBMintmyfunc(inta);namespaceSUNintmyfunc(doubleb);D.classApublic:intmyfunc(inta);classSubA:publicApublic:intmyfunc(doubleb);/注意这里不是重载28下面说法正确的是:DA.操作符重载可以改变操作符的运算优先级。B.操作符重载时,其预定义的操作数可以改变。例如“!”是一元操作符,可以重载成有两个参数的二元操作符。C.C+中所有的操作符都可以被重载。D.对于内置数据类型的操作符,它预定义的意义不能被修改;也不能为内置数据类型定义其它操作符。例如不能定义intoperator+(int,int);也不能定义voidoperator+(int,int)。29假如运行环境int类型4bytes,short类型2bytes,long类型8bytes,存在代码:Dunsignedshortx=65530;inta=myfunc(x,20.0);会优先匹配以下哪一个重载函数?A.intmyfunc(double,double)B.intmyfunc(short,double)C.doublemyfunc(int,float)D.doublemyfunc(int,double)30判断题类的析构函数可以是虚函数,但构造函数不可以。正确31判断题一个类的构造函数可以有多个,但析构函数只能有一个。正确32判断题当一个类中有指向其他资源的指针,并由类本身释放,那么可以使用编译系统生成的默认拷贝构造函数进行对象复制。错误33判断题下面的代码是否正确(错误)classCSomethingchar*m_c;public:CSomething()m_c=newchar;CSomething()deletem_c;m_c=NULL;CSomething(constCSomething&other)/拷贝构造*m_c=*other.m_c;/这里有问题,此时m_c没有空间,应该先m_c=newchar;CSomething&operator=(constCSomething&a1)/重载操作符应该跟拷贝构造是一样的;34CSomething是一个类,执行下面这些语句后,内存里创建了多少个CSomething对象?BCSomethinga;/1个CSomethingb(2);/1个CSomethingc3;/3个CSomething&ra=a;CSomethingd=a;/1个CSomething*pA=c;CSomething*p=newCSomething(4);/1个A.8B.7C.10D.935已知类D是类B的派生类,B有自己的私有数据成员,并实现了自己的拷贝构造函数,类D的拷贝构造函数应该怎么实现?DA、B、D:D(constD&other)D:D(constD&other)拷贝类D新增的成员拷贝父类B的成员可以用下面的方式实现:(B*)this->B(other),但是D答案是比较标准的做法拷贝类D新增的成员C、D、D:D(constD&other)D:D(constD&other):B(other)B:B(other);拷贝类D新增的成员拷贝类D新增的成员36关于类的构造和析构,下面哪个说法正确CA、构造函数和析构函数都是由系统自动调用的,程序不能主动调用/可以主动调用B、如果一个类没有声明缺省构造函数,则编译器会自动生成一个缺省构造函数如果定义了非缺省构造函数,而没有定义缺省构造函数,则不会自动生成缺省构造函数C、全局类对象的构造函数总是在main函数之前执行的D、构造函数和析构函数均不能被说明为虚函数/析构函数可以是虚的37在执行newA1时,下面代码的输出是什么A#include<iostream>intinit(conststd:string&info)std:cout<<info<<std:endl;return0;classAintm_x;public:A():m_x(init("InitA:m_x")在调用A的构造函数之前首先调用init函数,并将函数的返回值赋给A的成员变量m_xinit("CallA:A()");/定义构造函数;classA1:publicAintm_x;intm_y;public:A1():m_x(init("InitA1:m_x"),m_y(init("InitA1:m_y")这是初始化表达式表,用于在进入构造函数之前先初始化类的成员变量init("CallA1:A1()");A、B、InitA:m_xCallA1:A1()CallA:A()InitA1:m_xInitA1:m_xInitA1:m_yInitA1:m_yCallA:A()CallA1:A1()InitA:m_xC、D、InitA:m_xCallA1:A1()CallA:A()InitA1:m_xInitA1:m_yInitA1:m_yCallA1:A1()CallA:A()38有如下的类定义classBase.public:virtualBase()std:cout<<"DestroyBase"<<std:endl;classDerive1:publicBase.public:Derive1()std:cout<<"DestroyDerive1"<<std:endl;classDerive2:publicDerive1.public:Derive2()std:cout<<“DestroyDerive2”<<std:endl;在执行:Derive1*pObj=newDerive2();.deletepObj;时,输出是:CA、B、DestroyDerive1DestroyBaseDestroyBaseDestroyDerive1DestroyDerive2C、D、DestroyDerive2上面都不对DestroyDerive1DestroyBase39对于如下的类定义CclassBasepublic:Base(intval=0):m_x(val)Base(constBase&oth):m_x(oth.m_x)private:intm_x;classDerived:publicBasepublic:Derived(intval):Base(val),m_y(val)Derived(constDerived&oth):m_y(oth.m_y)private:intm_y;下面代码中Derivedd1(10);/d1.m_x=10,d1.m_y=10Derivedd2=d1;/先调Base(intval=0):m_x(val),然后调派生类的拷贝构造d2.m_x和d2.m_y各是多少?A、10,10B、10,0C、0,10D、0,040下面的代码DclassBaseprotected:intm_a;public:Base(inta):m_a(a);classDerived:publicBaseintm_b;intm_c;public:Derived(inta,intc):m_c(c),Base(a),m_b(m_a+m_c)初始化不是以初始化列表为序的,是以成员定义的顺序进行的,如有基类是先进行基类的初始化,所以m_b为随机值;Deriveda1(1,10);中a1.m_a、a1.m_b、a1.m_c的取值是A、1,10,10B、1,1,10C、1,11,10D、以上都不对41下面的主程序中,语句(A)是错误的。classAinti;public:virtualvoidfun()=0;A(inta)i=a;classBintj;public:voidfun()cout<<"B:fun()n"B(intb,intc):A(b)j=c;voidmain()_AAa(5);/A是抽象类,不能初始化BA*pa;CBb(7,6)DB*pb;42分析下列程序中的错误,并说明出错原因。classAintx;public:A(inta)x=a;fun()构造函数中调用了纯虚函数;链接错误;-Avirtualvoidfun()=0;classB:publicApublic:B(intb):A(b)voidfun()-B;voidmain()Aaa(5);-CA类含有纯虚函数,是抽象类,无法实例化Bbb(8);-D请选择出下面说明错误的地方BA:fun();,构造函数不能调用纯虚函数B:voidfun()必须写成virtualvoidfun()C:Aaa(5);抽象类不能定义对象D:对象bb的成员x为8;43下列关于析构函数的描述中正确的是(B)A.析构函数可以重载B.析构函数可以是虚函数C.析构函数名与类名相同D.析构函数的返回类型为void44下列关于纯虚函数的描述中,正确的是(D)A.纯虚函数是一种特殊的虚函数,它是个空函数/不是空函数,而是根本没有实现B.具有纯虚函数的类称为虚基类/叫抽象类,虚基类是多重继承时候的virtual继承C.一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数不对,派生类可以仍不实现,而交由派生类的后续派生类实现D.具有纯虚函数的类不能创建类对象45要将类说明是类的虚基类,正确的描述是(B)A.classvirtualB:publicAB.classB:virtualpublic这两个关键字的顺序可以调换A/这样B类的实例中会多一个虚基类指针出来C.virtualclassB:publicAD.classB:publicAvirtual46写出下面程序的输出结果。A:f()nB:f()n#include<iostream.h>classApublic:virtualvoidf()cout<<"A:f()n"classB:publicAprivate:char*buf;public:B(inti)buf=newchari;voidf()cout<<"B:f()n"B()deletebuf;voidmain()A*a=newA;a->f();deletea;a=newB(15);a->f();多态输出结果为(由于排版的关系,由多个空格表示回转换行):BA:A:f()A:f()B:A:f()B:f()C:B:f()B:f()D:程序会抛出异常47类B是通过public继承方式从类A派生而来的,且类A和类B都有完整的实现代码,那么下列说法正确的是:(B)A.类B中具有pubic可访问性的成员函数个数一定不少于类A中public成员函数的个数。不对,因为派生类可以重新调整继承而来的成员的可访问性,例如:classBB;classDD:publicBBprivate:usingBB:Test_protect;usingBB:Test_public;protected:public:;B.一个类B的实例对象占用的内存空间一定不少于一个类A的实例对象占用的内存空间。C.只要类B中的构造函数都是public的,在main函数中就可以创建类B的实例对象。如果类A的构造函数是private的就不行了D.类A和类B中的同名虚函数的返回值类型必须完全一致。子类可以重载或遮蔽基类的成员48下列哪种函数可以是虚的:(D)A.自定义的构造函数B.拷贝构造函数C.静态成员函数D.析构函数49判断题虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。正确50判断题A从B中派生,B定义了一个纯虚函数Virtualvoidfun(void)=0;A在声明该方法时可以不带Virtual限定符,如:voidfun(void);正确51以下叙述正确的是(C)A.构造函数调用虚函数采用动态联编/虽然调用的是虚函数,但却是静态调用的B.构造函数可以说明为虚函数C.当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数D.析构函数调用虚函数采用动态联编/虽然调用的是虚函数,但却是静态调用的52以下关于抽象类的描述正确的是(D)A.不能说明指向抽象类对象的指针或引用B.可以说明抽象类对象C.抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出D.抽象类的纯虚函数的实现由派生类给出53判断题一个经过排序了的链表,不适合使用二分法查找数据。正确54判断题二叉树的前序、中序、后序遍历常用递归方式实现。正确55请描述下面这个二叉树的前序遍历结果:BA.ABCDEFGHIB.ABDCEGFHI/前序遍历C.BDAGECHFI/中序遍历D.DBGEHIFCA/后序遍历56若进栈序列是4,3,2,1,则出栈序列是:AA.1,2,3,4B.3,2,4,1C.4,3,2,1D.1,3,2,457若进队序列是4,3,2,1,则出队序列是:CA.1,2,3,4B.3,2,4,1C.4,3,2,1D.1,3,2,458如果用单向链接实现堆栈,那么应该把栈顶放在链表的:AA.表头表尾无法弹栈B.表尾C.表头或表尾D.任何节点均可59如下选择数据结构的描述中,不正确的是:DA.如果需要随机访问,则线性表要比链表好得多B.如果已知要存储元素的个数,则线性表是一个比链表好的选择C.如果需要在中间频繁插入和删除元素,则链表显然要比线性表好D.对于离散的数据,使用线性表比链表要好60insert()函数完成单链表插入功能,请补充程序:Atypedefstructnode*link;structnodeintdata;linknext;/以head为头指针的单链表,要求在单链表的结点a之前插入结点b,如果单链表中没有a,则将b插入单链表的尾部。insert(link*head,inta,intb)linkp,q,s;s=(link)malloc(sizeof(*s);s->data=b;p=*head;if(p=NULL|p->data=a)*head=s;(_1_);elsewhile(p->data!=a&&p->next!=NULL)q=p;p=p->next;if(p->data=a)(_2_);s->next=p;else(_3_);s->next=NULL;A.s->next=p、q->next=s、p->next=sB.q->next=s、s->next=p、p->next=sC.q->next=s、p->next=s、s->next=pD.s->next=p、p->next=s、q->next=s61下面的程序是对二叉树的前序遍历,请写出下面空格中的语句:D其中,Visit函数表示访问节点数据。voidPreOrder(BinaryTreeNode*t)/对*t进行前序遍历if(t)(_1_);(_2_);(_3_);A.PreOrder(t->LeftChild)Visit(t)PreOrder(t->RightChild)B.PreOrder(t->LeftChild)PreOrder(t->RightChild)Visit(t)C.Visit(t)PreOrder(t->RightChild)PreOrder(t->LeftChild)D.Visit(t)PreOrder(t->LeftChild)PreOrder(t->RightChild)62请选择下面树形结构深度优先遍历出来的结果:CA.ABC