又刷了一套题
这些题都是百度、阿里巴巴、腾讯、网易、新浪等公司的面试原题,有一定的难度,不过确实相当有水平,可以通过做题来查漏补缺。
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
水题,用过就知道