华为C笔试题最全_第1页
华为C笔试题最全_第2页
华为C笔试题最全_第3页
华为C笔试题最全_第4页
华为C笔试题最全_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、脚本执行失败问题1. 虚函数是可以New一个对象的时候要根据虚函数的函数体来填虚表;而内联函数没有函数体,只是在预编译阶段展开内联的,这样就可以减少函数调用的开销,提高效率(错误)2. 一个类里可以同时存在同一个类里无论什么函数都不能函数名和参数完全一样参数和函数名都相同的虚函数与静态函数(错误)3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)特殊情况,参见题5,会调用父类的析构函数(正确)/任何情况下删除子类都会调用到父类的析构函数4对于下面的类CA,sizeof(CA) = _B_:A. 4 B. 8 C. 12 D. 16class CApu

2、blic: CA(); virtual CA(); /因为有虚函数,所以会有4个字节的虚表指针private: int m_iTime; /成员变量4个字节public: int GetTime(); int SetTime(int iTime);5下面这段程序,打印结果是_A_:A. 1 B. 2 C. 3 D. 以上都不对int g_iCount = 0; class CParentpublic: CParent() CParent() g_iCount += 1;class CSon : public CParentpublic: CSon() CSon() g_iCount += 2;

3、main()CParent* p = new CSon(); delete p由于p被声明成父类指针,并且父类和子类的析构函数都非虚,因此delete操作只能根据p指针声明的类型来调用父类的析构函数; std:cout << g_iCount << std:endl;6请问下面这段程序的输出结果是_A_:A. 2,1, B. 2,2, C. 1,1, D. 1,2,class CParentpublic: CParent() virtual CParent() public: virtual void Print() std:cout << "1,

4、" ;class CSon : public CParentpublic: CSon() ; virtual CSon() ;public: void Print() std:cout << "2," ;void Test1(CParent& oParent这里是引用了一个外部对象,该对象的虚表不会发生变化)oParent.Print();void Test2(CParent oParent这里会在栈空间内重新构造一个CParent类的对象,如果传入实参的类型与CParent不同则虚表会发生变化)oParent.Print();main() C

5、Son * p = new CSon(); Test1(*p); /这里只是一个引用 Test2(*p); /这里会在栈空间重新构造Cparent类对象 delete p;7请问下面这段程序的输出结果是_D_:A. 2,1, B. 2,2, C. 1,1, D. 1,2,class CParentpublic: CParent() virtual CParent() public: void Print() std:cout << "1," ; ;class CSon : public CParentpublic: CSon() virtual CSon() p

6、ublic: void Print() std:cout << "2," ;main() CSon oSon; 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,class CParentpublic: CParent() Print(); virtual CPa

7、rent() public: virtual void Print() std:cout << "1," ;class CSon : public CParentpublic: CSon() Print(); virtual CSon() public: void Print() std:cout << "2," ;main() CParent * pParent = new CSon()类的构造过程遵循压栈原则,构造过程中虚表尚未建立成功,是静态调用虚函数; delete pParent;9请问下面这段程序的输出结果是_D_:A

8、. 2,2, B. 2, C. 输出结果不确定 D. 以上都不对class CParentpublic: CParent() Print();构造子类对象时调用到父类的构造函数,但父类的Print函数是纯虚的,没有实现,所以这里的调用不成功,编译会出错 virtual CParent() public: virtual void Print() = 0;class CSon : public CParentpublic: CSon() Print(); virtual CSon() public: void Print() std:cout << "2," ;m

9、ain() CParent * pParent = new CSon(); delete pParent;10请仔细阅读以下程序: class Basepublic:virtual bool operator = (int iValue)std:cout << "I am Base class !" << std:endl;return true;virtual Base();class Derive: public Basepublic:virtual bool operator = (int iValue)std:cout << &q

10、uot;I am Derive class !" << std:endl;return true;virtual Derive();int main()Derive derive;Base* pBase = &derive;Derive* pDerive = &derive;*pBase = 0;*pDerive = 0;重载操作符声明为virtual使操作符产生多态性return 0;程序的输出结果是_B_:A、I am Base class !I am base class !B、I am Derive class !I am Derive class

11、 !C、I am base class !I am Derive class !D、I am Derive class !I am Base class ! 11请仔细阅读以下程序:class Basepublic:virtual void display(std:string strShow = "I am Base class !") std:cout << strShow << std:endl; virtual Base();class Derive: public Basepublic:virtual void display(std:st

12、ring strShow = "I am Derive class !") std:cout << strShow << std:endl; virtual Derive();int main()Base* pBase = new Derive();Derive* pDerive = new Derive();pBase->display();pDerive->display();由于这两处调用display函数使用了默认参数,而默认参数是通过指针类型来确认的delete pBase;delete pDerive;return 0;程序的

13、输出结果是_C_:A、I am Base class !I am base class !B、I am Derive class !I am Derive class !C、I am base class !I am Derive class !D、I am Derive class !I am Base class !12请仔细阅读以下程序:class Basepublic:virtual void display() const这个const将隐含的this指针声明成const类型,所以相当于父类和子类的display函数具有不同的参数,也就是说子类遮蔽了display函数,此处不具有多态

14、性 std:cout << "I am Base class !" << std:endl; virtual Base();class Derive: public Basepublic:virtual void display() std:cout << "I am Derive class !"<< std:endl; virtual Derive();int main()Base* pBase = new Derive();Derive* pDerive = new Derive();pBase-&g

15、t;display();pDerive->display();delete pBase;delete pDerive;return 0;程序的输出结果是_C_:A、I am Base class !I am base class !B、I am Derive class !I am Derive class !C、I am base class !I am Derive class !D、I am Derive class !I am Base class !13在C+中,多态性存在于_B_:A、同一个类的多个同名函数之间B、子类继承层次中C、父类的多个同名函数之间 D、以上都不是14下

16、面黑体加粗的语句存在问题,请问下面的修改哪个是正确的?Bclass Apublic:void Func();.;class Bprivate:bool Func() const;注意这里是私有的哦 .;class C: public A, public B.; / class definition is unimportantC test;test.Func(); /look hereAtest.B:Func(); Btest.A:Func();C、D语法错误,A中B:Funs()是私有的不可访问CB:test.Func(); DA:test.Func();15判断:子类可以访问父类保护成员,

17、子类的友元类也可以子类可以访问的,其友元都可以访问通过子类对象去访问父类的保护成员。(正确)16. 下面对protected继承的描述正确的是:C /注意这里是保护继承A父类的友元类可以访问子类保护成员B子类的友元类可以访问父类的私有成员C子类可以访问父类的保护成员此时父类的所有成员都是子类的保护成员(不包括父类的私有成员)D父类可以访问子类的保护成员17对于下面的代码,描述正确的是:Aclass A public:virtual void test();class B: public Apublic:void test();.;class C: public Bpublic:void tes

18、t();.;AB类的test函数是虚函数,而C类的也是BB类的test函数不是虚函数CB类的test函数是虚函数,而C类的不是DC类的test函数不是虚函数18请指出如下程序的输出结果:D#include<iostream.h>class base public: base() cout << "base()" base() cout << "base()" ; class subs: public base public: subs() cout << "subs()" subs()

19、cout << "subs()" ; void main() subs s;就是子类构造的压栈原则Asubs()base()subs()base()Bbase()subs()base()subs()Csubs()base()base()subs()Dbase()subs()subs()base()19请指出如下程序的输出结果:B#include <iostream.h>class A public:int n; class B: public A ; class C: public A ; class D: public B, public C注意这

20、里的继承顺序决定了在内存种B:n在C:n的前面 ; void main() D d; d.B:n=10; d.C:n=20; cout << d.B:n << "," << d.C:n;A20,20 B10,20 C20,10 D10,1020判断题:友元(friend)没有破坏类的封装。错误21下面哪种说法是正确的:BA.派生类从基类public派生,派生类可以直接访问基类private的成员变量和成员函数。 B.派生类从基类public派生,派生类可以直接访问基类protected的成员变量和成员函数。 C.派生类从基类public派

21、生,外部可以直接访问派生类中基类部分protected的成员变量和成员函数。D.派生类从基类protected派生,外部可以直接访问派生类中基类部分public的成员变量和成员函数。 22下面哪种说法是不正确注意这里是不正确的说法的:DA.外部对象不能直接访问类private的成员变量和使用private的成员函数。B.外部对象不能直接访问类protected的成员变量和使用protected的成员函数。C.外部对象可以直接访问类public的成员变量和使用public的成员函数。D.友元(friend)不能直接访问类的private的成员变量和使用private的成员函数。23下面那个不是类

22、成员访问限定符:DA. public B. private C. protected D. friend24请阅读下面程序片断,成员函数setName的访问限定是什么?Astruct 结构的缺省权限是public类的缺省权限是privateMan void setName(const std:string & strName); void setAge(unsigned int iAge);std:string getName() const;unsigned int getAge() const; private: unsigned int m_iAge; std:string m_

23、strName;A. public B. private C. protected D. friend25下面说法是否正确?错误存在下面重载函数声明:1)void myfunc(char a);2)void myfunc(long b);则下面调用的代码匹配第一个函数编译不通过int c=100; myfunc(c);26下面哪种情形下myfunc函数声明是重载重载仅关注函数名和参数类型?CA. int myfunc(int a,double b) 和 double myfunc(int a, double b)B. int myfunc(int a,double b) 和 int myfun

24、c(int a,double b=0.5)C. int myfunc(int a,double b) 和 int myfunc(double b,int a)D. int myfunc(int a,double b) 和 double myfunc(int , double )27下面那种情形下myfunc函数声明是重载?BA. namespace IBM /两个名字空间中各有一个myfunc函数int myfunc(int a);namespace SUNint myfunc(double b);B. namespace IBMint myfunc(int a);namespace SUNu

25、sing namespace IBM;int myfunc(double b);SUN中发生了重载C. namespace IBMint myfunc(int a);namespace SUNint myfunc(double b);D. class Apublic: int myfunc(int a);class SubA: public Apublic: int myfunc(double b); /注意这里不是重载28下面说法正确的是:DA. 操作符重载可以改变操作符的运算优先级。B. 操作符重载时,其预定义的操作数可以改变。例如“!”是一元操作符,可以重载成有两个参数的二元操作符。C.

26、 C+中所有的操作符都可以被重载。D. 对于内置数据类型的操作符,它预定义的意义不能被修改;也不能为内置数据类型定义其它操作符。例如不能定义int operator+(int,int);也不能定义void operator+(int,int)。29假如运行环境int类型4bytes,short类型2bytes,long类型8bytes,存在代码:D unsigned short x = 65530; int a = myfunc( x, 20.0 );会优先匹配以下哪一个重载函数?A. int myfunc( double, double ) B. int myfunc( short, dou

27、ble )C. double myfunc( int, float )D. double myfunc( int, double )30判断题 类的析构函数可以是虚函数,但构造函数不可以。正确31判断题 一个类的构造函数可以有多个,但析构函数只能有一个。正确32判断题 当一个类中有指向其他资源的指针,并由类本身释放,那么可以使用编译系统生成的默认拷贝构造函数进行对象复制。错误33判断题 下面的代码是否正确(错误)class CSomething char* m_c;public: CSomething() m_c = new char; CSomething()delete m_c; m_c

28、= NULL; CSomething(const CSomething& other) /拷贝构造 *m_c = *other.m_c; /这里有问题,此时m_c没有空间,应该先m_c = new char; CSomething & operator=(const CSomething& a1) /重载操作符应该跟拷贝构造是一样的;34CSomething是一个类,执行下面这些语句后,内存里创建了多少个CSomething对象?BCSomething a; / 1个CSomething b(2); / 1个CSomething c3; /3个CSomething &a

29、mp;ra = a;CSomething d = a; /1个CSomething *pA = c;CSomething *p = new CSomething(4); /1个A. 8 B.7 C.10 D.935已知类D是类B的派生类,B有自己的私有数据成员,并实现了自己的拷贝构造函数,类D的拷贝构造函数应该怎么实现?DA、 B、 D:D(const D& other) D:D(const D& other) 拷贝类D新增的成员 拷贝父类B的成员可以用下面的方式实现:(B*)this->B(other),但是 D答案是比较标准的做法 拷贝类D新增的成员 C、 D、D:D

30、(const D& other) D:D(const D& other) : B(other) B:B(other); 拷贝类D新增的成员 拷贝类D新增的成员 36关于类的构造和析构,下面哪个说法正确 CA、构造函数和析构函数都是由系统自动调用的,程序不能主动调用 /可以主动调用B、如果一个类没有声明缺省构造函数,则编译器会自动生成一个缺省构造函数如果定义了非缺省构造函数,而没有定义缺省构造函数,则不会自动生成缺省构造函数C、全局类对象的构造函数总是在main函数之前执行的D、构造函数和析构函数均不能被说明为虚函数 /析构函数可以是虚的37在执行new A1时,下面代码的输出是

31、什么 A#include <iostream>int init(const std:string & info) std:cout << info << std:endl; return 0;class A int m_x;public:A():m_x(init("Init A:m_x")在调用A的构造函数之前首先调用init函数,并将函数的返回值赋给A的成员变量m_x init("Call A:A()"); /定义构造函数;class A1:public A int m_x; int m_y;public:

32、A1():m_x(init("Init A1:m_x"),m_y(init("Init A1:m_y")这是初始化表达式表,用于在进入构造函数之前先初始化类的成员变量 init("Call A1:A1()");A、 B、 Init A:m_x Call A1:A1() Call A:A() Init A1:m_x Init A1:m_x Init A1:m_y Init A1:m_y Call A:A() Call A1:A1() InitA:m_x C、 D、Init A:m_x Call A1:A1()Call A:A() Ini

33、t A1:m_xInit A1:m_y Init A1:m_yCall A1:A1() Call A:A()38有如下的类定义 class Base .public: virtual Base() std:cout << "Destroy Base" << std:endl; ;class Derive1:public Base .public: Derive1() std:cout << "Destroy Derive1" << std:endl; ;class Derive2 : public Deri

34、ve1.public:Derive2() std:cout << “Destroy Derive2” << std:endl; ;在执行: Derive1* pObj = new Derive2(); . delete pObj;时,输出是:CA、 B、 Destroy Derive1 Destroy Base Destroy Base Destroy Derive1 Destroy Derive2 C、 D、Destroy Derive2 上面都不对Destroy Derive1Destroy Base39对于如下的类定义 Cclass Basepublic: Bas

35、e(int val = 0):m_x(val) Base(const Base& oth):m_x(oth.m_x)private: int m_x;class Derived:public Basepublic: Derived(int val):Base(val), m_y(val) Derived(const Derived& oth):m_y(oth.m_y)private: int m_y;下面代码中Derived d1(10); /d1.m_x=10,d1.m_y=10Derived d2 = d1; /先调Base(int val = 0):m_x(val),然后

36、调派生类的拷贝构造d2.m_x和d2.m_y各是多少?A、10,10 B、10, 0 C、0,10 D、0, 040下面的代码 Dclass Baseprotected: int m_a;public: Base(int a):m_a(a);class Derived:public Base int m_b; int m_c;public: Derived (int a, int c):m_c(c), Base(a), m_b(m_a+m_c)初始化不是以初始化列表为序的,是以成员定义的顺序进行的,如有基类是先进行基类的初始化,所以m_b为随机值;Derived a1(1,10);中a1.m_

37、a、a1.m_b、a1.m_c的取值是A、1,10,10 B、1,1,10 C、1,11,10 D、以上都不对41下面的主程序中,语句(A)是错误的。 class A int i; public: virtual void fun()=0; A(int a) i=a; ; class B int j; public: void fun() cout<<"B:fun()n" B(int b,int c) :A(b) j=c; ;void main()_AA a(5); /A是抽象类,不能初始化BA *pa; CB b(7,6)DB *pb; 42分析下列程序中的错

38、误,并说明出错原因。 class A int x; public: A(int a) x=a; fun()构造函数中调用了纯虚函数;链接错误; - A virtual void fun()=0; ; class B:public A public:B(int b) :A(b) void fun() - B; void main() A aa(5); - CA类含有纯虚函数,是抽象类,无法实例化 B bb(8); - D请选择出下面说明错误的地方 BA: fun();,构造函数不能调用纯虚函数B: void fun() 必须写成virtual void fun()C: A aa(5); 抽象类不

39、能定义对象D: 对象bb的成员x为8;43下列关于析构函数的描述中正确的是(B)A.析构函数可以重载 B.析构函数可以是虚函数C.析构函数名与类名相同 D.析构函数的返回类型为void44下列关于纯虚函数的描述中,正确的是 (D)A.纯虚函数是一种特殊的虚函数,它是个空函数 /不是空函数,而是根本没有实现B.具有纯虚函数的类称为虚基类 /叫抽象类,虚基类是多重继承时候的virtual继承C.一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数不对,派生类可以仍不实现,而交由派生类的后续派生类实现D.具有纯虚函数的类不能创建类对象45要将类说明是类的虚基类,正确的描述是 (B)A.class

40、virtual B:public A B.class B:virtual public这两个关键字的顺序可以调换 A /这样B类的实例中会多一个虚基类指针出来C.virtual class B:public A D.class B:public A virtual46写出下面程序的输出结果。A:f()n B:f()n#include < iostream.h>class A public:virtual void f() cout<<"A:f()n" ; class B:public Aprivate: char *buf;public:B(int

41、i) buf=new chari; void f() cout<<"B:f()n"B() delete buf; ;void main() A *a=new A;a->f(); delete a;a=new B(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可访问性的成员函数

42、个数一定不少于类A中public成员函数的个数。不对,因为派生类可以重新调整继承而来的成员的可访问性,例如: class BB;class DD : public BBprivate:using BB:Test_protect;using BB:Test_public;protected:public:; B. 一个类B的实例对象占用的内存空间一定不少于一个类A的实例对象占用的内存空间。 C. 只要类B中的构造函数都是public的,在main函数中就可以创建类B的实例对象。如果类A的构造函数是private的就不行了D. 类A和类B中的同名虚函数的返回值类型必须完全一致。子类可以重载或遮蔽基

43、类的成员48下列哪种函数可以是虚的:(D)A. 自定义的构造函数 B. 拷贝构造函数 C. 静态成员函数 D. 析构函数 49判断题 虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。正确50判断题 A从B中派生,B定义了一个纯虚函数Virtual void fun(void) = 0; A在声明该方法时可以不带Virtual限定符,如:void fun(void); 正确51以下叙述正确的是( C )A. 构造函数调用虚函数采用动态联编 /虽然调用的是虚函数,但却是静态调用的B. 构造函数可以说明为虚函数C. 当基类的析构函数是虚函数时,它的派

44、生类的析构函数也是虚函数D. 析构函数调用虚函数采用动态联编 /虽然调用的是虚函数,但却是静态调用的52以下关于抽象类的描述正确的是 ( D )A. 不能说明指向抽象类对象的指针或引用B. 可以说明抽象类对象C. 抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出D. 抽象类的纯虚函数的实现由派生类给出53判断题 一个经过排序了的链表,不适合使用二分法查找数据。正确54判断题 二叉树的前序、中序、后序遍历常用递归方式实现。 正确55请描述下面这个二叉树的前序遍历结果:B A. ABCDEFGHIB. ABDCEGFHI /前序遍历C. BDAGECHFI /中序遍历D. DBGEHIFC

45、A /后序遍历56若进栈序列是4,3,2,1,则出栈序列是:AA. 1,2,3,4 B. 3,2,4,1C. 4,3,2,1 D. 1,3,2,457若进队序列是4,3,2,1,则出队序列是:C A. 1,2,3,4 B. 3,2,4,1 C. 4,3,2,1 D. 1,3,2,458如果用单向链接实现堆栈,那么应该把栈顶放在链表的:AA. 表头表尾无法弹栈B. 表尾C. 表头或表尾D. 任何节点均可59如下选择数据结构的描述中,不正确的是:D A. 如果需要随机访问,则线性表要比链表好得多B. 如果已知要存储元素的个数,则线性表是一个比链表好的选择C. 如果需要在中间频繁插入和删除元素,则链

46、表显然要比线性表好D. 对于离散的数据,使用线性表比链表要好60insert()函数完成单链表插入功能,请补充程序:Atypedef struct node *link;struct nodeint data;link next; ;/以head为头指针的单链表,要求在单链表的结点a之前插入结点b,如果单链表中没有a,则将b插入单链表的尾部。insert ( link *head,int a, int b) link p,q,s; s = (link) malloc (sizeof(*s); s->data= b; p= *head; if ( p=NULL | p->data=a

47、) *head=s; (_1_); else while (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->ne

48、xt= p、p->next=s、q->next=s61下面的程序是对二叉树的前序遍历,请写出下面空格中的语句:D其中,Visit函数表示访问节点数据。void PreOrder(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-

49、>RightChild) PreOrder(t->LeftChild)D. Visit(t) PreOrder(t->LeftChild) PreOrder(t->RightChild)62请选择下面树形结构深度优先遍历出来的结果:C A. ABCDEFGHB. HEBAFCGDC. ABEHCFGDD. HEBFGCDA63判断题:函数模板是宏缺省情况下是内联的。错误64判断题:以下定义是否正确:正确template <typename T> void fill (T* pArray, int size, T const &value = T()6

50、5判断题 以下定义是否正确:错误template <typename T1, typename T2>inline T1 const & max(T1 const &a , T2 const &b)return a< b ? b:a; /函数返回值不应该为T1 const &,有可能是T1,或者T2类型的66emplate <typename T>inline T const & max(T const & a, T const & b).下面那个会引起编译错误:Ba. max(4,7)b. max(4,4.2)c. max(static_cast<double>(4), 4.2)d. max<double>(4,4.2)67#include <string>template <typename T>inline T max(T a , T b)return a<b ? b:a;下面哪个调用会引起编译错误的 Ca. :max("app

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论