C/C++综合测试题(四)

又刷了一套题

 

这些题都是百度、阿里巴巴、腾讯、网易、新浪等公司的面试原题,有一定的难度,不过确实相当有水平,可以通过做题来查漏补缺。

 

 

11.下面代码的输出是什么?

class A
{
public:
	A()  {     }
	~A()
	{
		cout<<"~A"<<endl;
	}
};

class B:public A
{
public:
	B(A &a):_a(a)
	{

	}
	~B()
	{
		cout<<"~B"<<endl;
	}
private:
	A _a;
};

int main(void)
{
	A a;       //很简单,定义a的时候调用了一次构造函数
	B b(a);
}

A.      ~B

B.     ~B~A

C.    ~B~A ~A

D.    ~B~A ~A ~A

 



答案:D

要搞懂构造和析构的循序

构造顺序:

基类构造函数>子类成员变量构造函数 >子类构造函数

析构顺序:

子类析构函数>子类成员变量析构函数 >基类析构函数


 


12.以下程序的结果? 

void foo(int *a, int *b)
{
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}
void main()
{
    int a = 1, b = 2, c = 3;
    foo(&a, &b);
    foo(&b, &c);
    foo(&c, &a);
    printf("%d, %d, %d", a, b, c);
}


A.     123

B.     132

C.    213

D.    321

 

 


答案:B

水题。。。

 

 

13.下列一段C++代码的输出是?

#include "stdio.h"
class Base
 {
 public:
     int Bar(char x)
     {
         return (int)(x);
     }
     virtual int Bar(int x)
     {
         return (2 * x);
     }
 };
 class Derived : public Base
 {
 public:
     int Bar(char x)
     {
         return (int)(-x);
     }
     int Bar(int x)
     {
         return (x / 2);
     }
 };
 int main(void)
 {
     Derived Obj;
     Base *pObj = &Obj;
     printf("%d,", pObj->Bar((char)(100)));
     printf("%d,", pObj->Bar(100));
 }



A.    100-100

B.    10050

C.    200-100

D.    20050




 

答案:B

printf("%d,", pObj->Bar((char)(100)));
printf("%d,", pObj->Bar(100));

第1句调用Base类的intBar(charx)函数

2句调用Derived类的intBar(intx)函数




14.C++类体系中,不能被派生类继承的有?

A.    构造函数

B.    静态成员函数

C.    非静态成员函数

D.    赋值操作函数

 

 


答案:A

构造函数可以被子类调用,但不能被子类继承,其它的,BCD都可以

 

 

15.下面有关mallocnew,说法错误的是? 

A.    new建立的是一个对象,malloc分配的是一块内存.

B.    new初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存

C.   newmalloc都是保留字,不需要头文件支持

D.    newmalloc都可用于申请动态内存,new是一个操作符,malloc是是一个函数

 

 

 

答案:C

用过就知道,malloc需要#include<malloc.h>

 

 

16.下面有关类的静态成员和非静态成员,说法错误的是? 

A.    静态成员存在于内存,非静态成员需要实例化才会分配内存

B.    非静态成员可以直接访问类中静态的成员

C.    静态成员能访问非静态的成员

D.    非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念

 

 

 

答案:C

关键在于分清静态成员非静态成员的区别

非静态成员必须实例化之后,才是一个实体

而静态成员和类的对象无关,它一直存在于内存中

 

 

17.下列代码的输出为:

class CParent
{
public:
	virtual void Intro()
	{
		printf( "I'm a Parent, " );
		Hobby();
	}
	virtual void Hobby()
	{
		printf( "I like football!" );
	}
};
class CChild : public CParent
{
public:
	virtual void Intro()
	{
		printf( "I'm a Child, " );
		Hobby();
	}
	virtual void Hobby()
	{
		printf( "I like basketball!\n" );
	}
};
int main( void )
{
	CChild *pChild = new CChild();
	CParent *pParent = (CParent *) pChild;
	pParent->Intro();
	return(0);
}




A.      I'm a ParentI like football!

B.     I'ma Parent I like basketball!

C.    I'ma Child I like basketball!

D.    I'ma Child I like football!

 

 

答案:C

类中的函数都是虚函数,所以

CParent *pParent = (CParent *) pChild;
CParent *pParent = pChild;  

的输出结果是一样的



18.32位小端的机器上,如下代码输出是什么:

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};
short *pshort = (short *)array;
int *pint = (int *)array;
int64 *pint64 = (int64 *)array;
printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

A.    0x2010x403 0x807060504030201 0x0

B.    0x201 0x6050x807060504030201 0x0

C.    0x201 0x6050x4030201 0x8070605

D.    0x102 0x5060x102030405060708 0x0

 


 

答案:B

我把int64改成_int64之后,编译器输出的结果是答案C

看了网友的解释,意思是把int64看成是普通的64位整形数,所以答案是B

 


19.switch(c)语句中,c不可以是什么类型()

A.    int

B.    long

C.   char

D.    float

 

 

答案:D

float存在精度问题

 

 

20.头文件中的ifndef/define/endif干什么用?

A.     定义常量

B.    标记为特殊的头文件

C.    防止头文件被重复引用

D.    注释头文件

 

 

答案:C

水题,用过就知道








你可能感兴趣的:(C++,面试)