您的位置:首页 > 编程语言 > C语言/C++

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

2015-06-04 11:15 525 查看
又刷了一套题
 
这些题都是百度、阿里巴巴、腾讯、网易、新浪等公司的面试原题,有一定的难度,不过确实相当有水平,可以通过做题来查漏补缺。
 
 
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.     1,2,3
B.     1,3,2
C.    2,1,3
D.    3,2,1
 
 

答案: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.    100,50
C.    200,-100
D.    200,50

 
答案: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
构造函数可以被子类调用,但不能被子类继承,其它的,B、C、D都可以
 
 
15.下面有关malloc和new,说法错误的是? 
A.    new建立的是一个对象,malloc分配的是一块内存.
B.    new初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存
C.   new和malloc都是保留字,不需要头文件支持
D.    new和malloc都可用于申请动态内存,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 Parent,I 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.    0x201,0x403, 0x807060504030201,
0x0
B.    0x201, 0x605,0x807060504030201,
0x0
C.    0x201, 0x605,0x4030201,
0x8070605
D.    0x102, 0x506,0x102030405060708,
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++ 面试