近期出现的C++面试题整理附详细答案Word文档下载推荐.docx

上传人:b****5 文档编号:20326887 上传时间:2023-01-22 格式:DOCX 页数:40 大小:32.36KB
下载 相关 举报
近期出现的C++面试题整理附详细答案Word文档下载推荐.docx_第1页
第1页 / 共40页
近期出现的C++面试题整理附详细答案Word文档下载推荐.docx_第2页
第2页 / 共40页
近期出现的C++面试题整理附详细答案Word文档下载推荐.docx_第3页
第3页 / 共40页
近期出现的C++面试题整理附详细答案Word文档下载推荐.docx_第4页
第4页 / 共40页
近期出现的C++面试题整理附详细答案Word文档下载推荐.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

近期出现的C++面试题整理附详细答案Word文档下载推荐.docx

《近期出现的C++面试题整理附详细答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《近期出现的C++面试题整理附详细答案Word文档下载推荐.docx(40页珍藏版)》请在冰豆网上搜索。

近期出现的C++面试题整理附详细答案Word文档下载推荐.docx

a[]?

=?

“hello”;

a[0]?

‘X’;

*p?

“world”;

//?

注意p?

指向常量字符串

p[0]?

编译器不能发现该错误,运行时错误

(2)?

用运算符sizeof?

可以计算出数组的容量(字节数)。

sizeof(p),p?

为指针得到的是一个指针变量的字节数,而不是p?

所指的内存容量。

C++/C?

语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

“hello?

world”;

a;

cout<

<

sizeof(a)?

endl;

12?

字节

sizeof(p)?

4?

计算数组和指针的内存容量

void?

Func(char?

a[100])

{

字节而不是100?

}?

1.类成员函数的重载、覆盖和隐藏区别?

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual?

关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(3)参数相同;

(4)基类函数必须有virtual?

关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。

此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual?

此时,基类的函数被隐藏(注意别与覆盖混淆)

1.面向对象的三个基本特征,并简单叙述之?

封装:

将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,?

protected,public)

2.?

继承:

广义的继承有三种实现形式:

实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承?

(仅使用属性和方法,实现滞后到子类实现)。

前两种(类继承)和后一种(对象组合=>

接口继承以及纯虚函数)构成了功能复用的两种方式。

3.?

多态:

是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

简单的说,就是一句话:

允许将子类类型的指针赋值给父类类型的指针。

9.?

请简单描述Windows内存管理的方法。

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~

我先说个大概,希望能够抛砖引玉吧

当程序运行时需要从内存中读出这段程序的代码。

代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。

把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。

这个就是内存管理所要做的事。

内存管理还有另外一件事需要做:

计算程序片段在主存中的物理位置,以便CPU调度。

内存管理有块式管理,页式管理,段式和段页式管理。

现在常用段页式管理

块式管理:

把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程?

序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。

这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。

页式管理:

把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

段式管理:

把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。

一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

段页式管理:

结合了段式管理和页式管理的优点。

把主存分为若干页,每一页又分为若干段。

好处就很明显,不用我多说了吧。

各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。

这只是一个大概而已,不足以说明内存管理的皮毛。

无论哪一本操作系统书上都有详细的讲解

10.main?

主函数执行完毕后,是否可能会再执行一段代码,给出说明?

可以,可以用_onexit?

注册一个函数,它会在main?

之后执行int?

fn1(void),?

fn2(void),?

fn3(void),?

fn4?

(void);

main(?

String?

str(“zhanglin”);

_onexit(?

fn1?

);

fn2?

fn3?

printf(?

“This?

is?

executed?

first.\n”?

}

int?

fn1()

“next.\n”?

return?

0;

fn2()

“executed?

”?

fn3()

“is?

fn4()

Csdn文档摘要:

The?

_onexit?

function?

passed?

the?

address?

of?

a?

(func)?

to?

be?

called?

when?

program?

terminates?

normally.?

Successive?

calls?

create?

register?

functions?

that?

are?

in?

LIFO?

(last-in-first-out)?

order.?

cannot?

take?

parameters.

11.const?

符号常量;

(1)const?

*p

(2)char?

(3)char?

*?

p

说明上面三种描述的区别.

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:

*p;

c1=’a’;

c2=’b’;

p=&

c1;

//ok

c2;

*p=c1;

//error

此时*p可以修改,而p不能修改。

(4)const?

这种是地址及指向对象都不能修改。

12.下面是C语言中两种if语句判断方式。

请问哪种写法更好?

为什么?

n;

if?

(n?

==?

10)?

第一种判断方式

(10?

n)?

第二种判断方式

如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=

13.?

*p++?

自增p?

还是p?

所指向的变量?

答:

后缀++?

和–?

操作符本质上比前缀一目操作的优先级高,?

因此*p++?

和*(p++)?

等价,?

它自增p?

并返回p?

自增之前所指向的值。

要自增p?

指向的值,?

使用(*p)++,?

如果副作用的顺序无关紧要也可以使用++*p。

14.?

#pragma?

是什么,?

有什么用?

#pragam?

指令提供了一种单一的明确定义的?

“救生舱”,?

可以用作各种?

(不可移植的)?

实现相关的控制和扩展:

源码表控制、结构压缩、警告去除?

(就像?

lint?

的老?

/*?

NOTREACHED?

*/注释),?

等等。

15.“#pragma?

once”?

是什么意思?

我在一些头文件中看到了它。

这是某些预处理器实现的扩展用于使头文件自我识别;

它跟#ifndef技巧等价,?

不过移植性差些。

16.?

进程间通信的方式有?

共享内存,?

管道?

,Socket?

,消息队列?

?

DDE等

17.?

如何打印出当前源文件的文件名以及源文件的当前行号?

cout?

__FILE__?

;

__LINE__?

__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。

18.?

如何判断一段程序是由C?

编译程序还是由C++编译程序编译的?

#ifdef?

__cplusplus

”c++”;

#else

”c”;

#endif

19.?

New?

delete?

与malloc?

free?

的联系与区别?

都是在堆(heap)上进行动态的内存操作。

用malloc函数需要指定内存分配的字节数并且不能初始化对象,new?

会自动调用对象的构造函数。

会调用对象的destructor,而free?

不会调用对象的destructor.

20.介绍一下STL,详细说明STL如何实现vector。

STL?

(标准模版库,Standard?

Template?

Library)它由容器算法迭代器组成。

STL有以下的一些优点:

可以方便容易地实现搜索数据或对数据排序等一系列的算法;

调试程序时更加安全和方便;

即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。

vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。

21.?

指针和引用有什么分别;

如果传引用比传指针安全,为什么?

如果我使用常量指针难道不行吗?

(1)?

引用在创建的同时必须初始化,即引用到一个有效的对象;

而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.

不存在NULL引用,引用必须与合法的存储单元关联;

而指针则可以是NULL.

(3)?

引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;

而指针在任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.

(4)?

引用的创建和销毁并不会调用类的拷贝构造函数

(5)?

语言层面,引用的用法和对象一样;

在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.

不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。

指针仍然存在空指针,并且有可能产生野指针.

总的来说:

引用既具有指针的效率,又具有变量使用的方便性和直观性.

22.?

构造函数可否是虚汗数,为什么?

析构函数呢,可否是纯虚的呢?

构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。

析构函数可以为纯虚函数。

第二部分:

阅读判断题

#include?

“stdafx.h”

#define?

SQR(X)?

X*X

main(int?

argc,?

char*?

argv[])

10;

k?

2;

m?

1;

/=?

SQR(k+m)/SQR(k+m);

printf(“%d\n”,a);

这道题目的结果是什么啊?

define?

只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的

(k+m)*(k+m)/(k+m)*(k+m);

=>

(k+m)*1*(k+m);

a/9;

下面的代码有什么问题?

DoSomeThing(…)

p;

p?

malloc(1024);

分配1K的空间

(NULL?

p)

return;

realloc(p,?

2048);

空间不够,重新分配到2K

应该写成:

(char?

*)?

没有释放p的空间,造成内存泄漏。

写出运行结果:

{//?

test1

str[]?

sizeof(str)?

“:

“;

str;

i?

sizeof(i)?

*pp?

malloc(10);

6:

4:

1:

4

4.?

并请给出正确的写法。

DoSomeThing(char*?

str[16];

assert(NULL?

!

p);

sscanf(p,?

“%s%d”,?

str,?

n);

(0?

strcmp(str,?

“something”))

这句该写成:

&

5.?

i=10,?

j=10,?

k=3;

k*=i+j;

k最后的值是?

60

6.

struct?

A?

{?

t:

4;

k:

unsigned?

short?

i:

8;

long?

m;

sizeof(A)=?

(不考虑边界对齐)

7

CELL?

Declare?

bit?

field

character?

:

00000000?

foreground?

3;

00000?

00000000

intensity?

0000?

000?

background?

0?

blink?

0000000?

screen[25][80];

Array?

fields

二、位结构?

位结构是一种特殊的结构,?

在需按位访问一个字节或字的多个位时,?

位结构?

比按位运算符更加方便。

位结构定义的一般形式为:

struct位结构名{?

数据类型?

变量名:

整型常数;

位结构变量;

其中:

数据类型必须是int(unsigned或signed)。

整型常数必须是非负的整?

数,?

范围是0~15,?

表示二进制位的个数,?

即表示有多少位。

变量名是选择项,?

可以不命名,?

这样规定是为了排列需要。

例如:

下面定义了一个位结构。

struct{?

incon:

/*incon占用低字节的0~7共8位*/?

txcolor:

/*txcolor占用高字节的0~3位共4位*/?

bgcolor:

/*bgcolor占用高字节的4~6位共3位*/?

blink:

/*blink占用高字节的第7位*/?

}ch;

位结构成员的访问与结构成员的访问相同。

访问上例位结构中的bgcolor成员可写成:

ch.bgcolor?

注意:

位结构中的成员可以定义为unsigned,?

也可定义为signed,?

但当成员长?

度为1时,?

会被认为是unsigned类型。

因为单个位不可能具有符号。

位结构中的成员不能使用数组和指针,?

但位结构变量可以是数组和指针,?

如果是指针,?

其成员访问方式同结构指针。

位结构总长度(位数),?

是各个位成员定义的位数之和,?

可以超过两个字?

节。

位结构成员可以与其它结构成员一起使用。

info{?

name[8];

age;

addr?

address;

float?

pay;

state:

pay:

}workers;

上例的结构定义了关于一个工人的信息。

其中有两个位结构成员,?

每个位结?

构成员只有一位,?

因此只占一个字节但保存了两个信息,?

该字节中第一位表示工?

人的状态,?

第二位表示工资是否已发放。

由此可见使用位结构可以节省存贮空间。

7.下面代码有什么问题?

Void?

test3(char*?

str1)?

string[10];

if(strlen(str1)<

=10)?

strcpy(string,?

str1);

数组越界

strcpy拷贝的结束标志是查找字符串中的\0?

因此如果字符串中没有遇到\0的话?

会一直复制,直到遇到\0,上面的123都因此产生越界的情况

建议使用?

strncpy?

memcpy

8.下面的代码有什么问题?

class?

public:

A()?

p=this;

~A()?

if(p!

=NULL)?

p=NULL;

A*?

};

会自动调用析构函数。

所以析构中调用delete引起了无限递归。

9.i最后等于多少?

j?

i++;

if((i>

j++)?

(i++?

j))?

i+=j;

5

10.?

输出下面程序结果。

iostream.h>

virtual?

print(void)?

”A:

print()”<

B:

public?

”B:

C:

B

print(void)

”C:

print(A?

a)?

a.print();

main(void)?

a,?

*pa,*pb,*pc;

B?

b;

C?

c;

pa=&

pb=&

pc=&

b.print();

c.print();

pa->

print();

pb->

pc->

print(a);

print(b);

print(c);

A:

print()

pri

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1