《华为C++笔试题最全.doc》由会员分享,可在线阅读,更多相关《华为C++笔试题最全.doc(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流华为C+笔试题最全.精品文档.脚本执行失败问题1. 虚函数是可以New一个对象的时候要根据虚函数的函数体来填虚表;而内联函数没有函数体,只是在预编译阶段展开内联的,这样就可以减少函数调用的开销,提高效率(错误)2. 一个类里可以同时存在同一个类里无论什么函数都不能函数名和参数完全一样参数和函数名都相同的虚函数与静态函数(错误)3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)特殊情况,参见题5,会调用父类的析构函数(正确)/任何情况下删除子类都会调用到父类的析构函数4对于下面的类CA,sizeof(
2、CA) = _B_:A. 4 B. 8 C. 12 D. 16class CApublic: 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 CP
3、arentpublic: CSon() CSon() g_iCount += 2;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
4、:cout 1,; ;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() CSon * p = new CSon();
5、 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() public: void Print() std:cout Print(); pSon
6、-Print();由于父类和子类的Print函数都非虚,所以根据指针类型决定调用关系8请问下面这段程序的输出结果是_C_:A. 2,1, B. 2,2, C. 1,2, D. 1,1,class CParentpublic: CParent() Print(); virtual CParent() public: virtual void Print() std:cout 1,; class CSon : public CParentpublic: CSon() Print(); virtual CSon() public: void Print() std:cout 2,; main() C
7、Parent * pParent = new CSon()类的构造过程遵循压栈原则,构造过程中虚表尚未建立成功,是静态调用虚函数; delete pParent;9请问下面这段程序的输出结果是_D_:A. 2,2, B. 2, C. 输出结果不确定 D. 以上都不对class CParentpublic: CParent() Print();构造子类对象时调用到父类的构造函数,但父类的Print函数是纯虚的,没有实现,所以这里的调用不成功,编译会出错 virtual CParent() public: virtual void Print() = 0;class CSon : public C
8、Parentpublic: CSon() Print(); virtual CSon() public: void Print() std:cout 2,; ;main() 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:virtua
9、l bool operator = (int iValue)std:cout 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 D
10、erive class !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:string strShow = I am
11、Derive class !) std:cout strShow display();pDerive-display();由于这两处调用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
12、 !12请仔细阅读以下程序:class Basepublic:virtual void display() const这个const将隐含的this指针声明成const类型,所以相当于父类和子类的display函数具有不同的参数,也就是说子类遮蔽了display函数,此处不具有多态性 std:cout I am Base class ! std:endl; virtual Base()class Derive: public Basepublic:virtual void display() std:cout I am Derive class !display();pDerive-displ
13、ay();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下面黑体加粗的语句存在问题,请问下面的修改哪个是正确的?Bc
14、lass 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判断:子类可以访问父类保护成员,子类的友元类也可以子类可以访问的,其友元都可以访问通过子类对象去访问
15、父类的保护成员。(正确)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 test();AB类的test函数是虚函数,而C类的也是BB类的test函数不
16、是虚函数CB类的test函数是虚函数,而C类的不是DC类的test函数不是虚函数18请指出如下程序的输出结果:D#includeclass base public: base() cout base(); base() cout base(); class subs: public base public: subs() cout subs(); subs() cout subs(); void main() subs s;就是子类构造的压栈原则Asubs()base()subs()base()Bbase()subs()base()subs()Csubs()base()base()subs()
17、Dbase()subs()subs()base()19请指出如下程序的输出结果:B#include class A public:int n;class B: public A ; class C: public A ; class D: public B, public C注意这里的继承顺序决定了在内存种B:n在C:n的前面 ; void main() D d; d.B:n=10; d.C:n=20; cout d.B:n , B(other),但是 D答案是比较标准的做法 拷贝类D新增的成员 C、 D、D:D(const D& other) D:D(const D& other) : B(
18、other) B:B(other); 拷贝类D新增的成员 拷贝类D新增的成员 36关于类的构造和析构,下面哪个说法正确 CA、构造函数和析构函数都是由系统自动调用的,程序不能主动调用 /可以主动调用B、如果一个类没有声明缺省构造函数,则编译器会自动生成一个缺省构造函数如果定义了非缺省构造函数,而没有定义缺省构造函数,则不会自动生成缺省构造函数C、全局类对象的构造函数总是在main函数之前执行的D、构造函数和析构函数均不能被说明为虚函数 /析构函数可以是虚的37在执行new A1时,下面代码的输出是什么 A#include int init(const std:string & info) st
19、d: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: A1():m_x(init(Init A1:m_x),m_y(init(Init A1:m_y)这是初始化表达式表,用于在进入构造函数之前先初始化类的成员变量 init(Call A1:A1();A、 B、 Init A:m_
20、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_xC、 D、Init A:m_x Call A1:A1()Call A:A() Init A1:m_xInit A1:m_y Init A1:m_yCall A1:A1() Call A:A()38有如下的类定义 class Basepublic: virtual Base() std:cout Destroy Base std:endl; class Derive1:public B
21、asepublic: Derive1() std:cout Destroy Derive1 std:endl; class Derive2 : public Derive1public: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 上面都不
22、对Destroy Derive1Destroy Base39对于如下的类定义 Cclass Basepublic: Base(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_
23、y=10Derived d2 = d1; /先调Base(int val = 0):m_x(val),然后调派生类的拷贝构造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)初始化不是以初始化列表为序的,是以成员定义的顺序
24、进行的,如有基类是先进行基类的初始化,所以m_b为随机值Derived a1(1,10);中a1.m_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() coutB:fun()n; B(int b,int c) :A(b) j=c; void main()_AA a(5); /A是抽象类,不能初始化BA *pa;
25、 CB b(7,6)DB *pb; 42分析下列程序中的错误,并说明出错原因。 class A int x; public: A(int a) x=a; fun()构造函数中调用了纯虚函数;链接错误; - Avirtual void fun()=0; class B:public A public:B(int b) :A(b) void fun() - Bvoid main() A aa(5); - CA类含有纯虚函数,是抽象类,无法实例化 B bb(8); - D请选择出下面说明错误的地方 BA: fun();,构造函数不能调用纯虚函数B: void fun() 必须写成virtual vo
26、id fun()C: A aa(5); 抽象类不能定义对象D: 对象bb的成员x为8;43下列关于析构函数的描述中正确的是(B)A.析构函数可以重载 B.析构函数可以是虚函数C.析构函数名与类名相同 D.析构函数的返回类型为void44下列关于纯虚函数的描述中,正确的是 (D)A.纯虚函数是一种特殊的虚函数,它是个空函数 /不是空函数,而是根本没有实现B.具有纯虚函数的类称为虚基类 /叫抽象类,虚基类是多重继承时候的virtual继承C.一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数不对,派生类可以仍不实现,而交由派生类的后续派生类实现D.具有纯虚函数的类不能创建类对象45要将类说明是
27、类的虚基类,正确的描述是 (B)A.class 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 class A public:virtual void f() coutA:f()n; class B:public Aprivate: char *buf;public:B(int i) buf=new chari
28、; void f() coutf(); 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可访问性的成员函数个数一定不少于类A中public成员函数的个数。不对,因为派生类可以重新调整继承而来的成员的可访问性,例如: class BB;class DD : public BBprivate:
29、using BB:Test_protect;using BB: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定义了一个纯虚函数Virtual void fun(void) = 0; A在声明该方法时可以不带Virtual限定符,如:void fun(void); 正确51以下叙述正确的是( C )A. 构造函数调用虚函数采用动态联编 /虽然调用的是虚函数,但却是静态调用的B. 构造函数可以说明为虚函数C. 当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数D. 析构函数调用虚函数采用动态联编 /虽然调
限制150内