C++面试题.docx
《C++面试题.docx》由会员分享,可在线阅读,更多相关《C++面试题.docx(45页珍藏版)》请在冰豆网上搜索。
C++面试题
C++面试题
2008-11-4
1#include“filename.h”和#include的区别?
答:
对于#include编译器从标准库开始搜索filename.h
对于#include“filename.h”编译器从用户工作路径开始搜索filename.h
2头文件的作用是什么?
答:
一、通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需
要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
二、头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规
则能大大减轻程序员调试、改错的负担。
3C++函数中值的传递方式有哪几种?
答:
C++函数的三种传递方式为:
值传递、指针传递和引用传递。
4内存的分配方式的分配方式有几种?
答:
一、从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量。
二、在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内
存分配运
算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free
或delete释放
内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:
双向链表删除一个节点P
templatevoidlist:
:
delnode(intp)
{
intk=1;
listnode*ptr,*t;
ptr=first;
while(ptr->next!
=NULL&&k!
=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"你已经将数据项"<data<<"删除"<ptr->next=ptr->next->next;
length--;
deletet;
}
在节点P后插入一个节点:
templateboollist:
:
insert(typet,intp)
{
listnode*ptr;
ptr=first;
intk=1;
while(ptr!
=NULL&&k
{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!
=p)
returnfalse;
else
{
listnode*tp;
tp=newlistnode;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;
returntrue;
}
}
6写一个函数,将其中的\t都转换成4个空格。
voidchange(char*pstr)
{
while(*pstr++!
='\0')
{
if(*pstr=='\t')
}
}
7Windows程序的入口是哪里?
写出Windows消息机制的流程.
8如何定义和实现一个类的成员函数为回调函数?
9C++里面是不是所有的动作都是main()引起的?
如果不是,请举例.
答:
在运行c++程序时,通常从main()函数开始执行。
因此如果没有main(),程序将不完整,编译器将指出未定义main()函数。
例外情况:
如,在windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码。
由于
DLL模块不是独立的程序,因此不需要main().用于专用环境的程序--如机器人中的控制器芯片--可能不需要main().但常规的
独立程序都需要main().
10C++里面如何声明constvoidf(void)函数为C程序中的库函数?
11下列哪两个是等同的
intb;
Aconstint*a=&b;
Bconst*inta=&b;
Cconstint*consta=&b;
Dintconst*consta=&b;
12内联函数在编译时是否做参数类型检查
13三个float:
a,b,c
问值
(a+b)+c==(b+a)+c
(a+b)+c==(a+c)+b
14把一个链表反向填空
voidreverse(test*head)
{
test*pe=head;
test*ps=head->next;
while(ps)
{
pe->next=ps->next;
ps->next=head;
head=ps;
ps=pe->next;
}
}
15设计一个重采样系统,说明如何anti-alias
16某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)中运行,还需要优化吗?
17.下面哪种排序法对12354最快
aquicksort
b.bublesort
c.mergesort
18.哪种结构,平均来讲,获取一个值最快
a.binarytree
b.hashtable
c.stack
19请问C++的类和C里面的struct有什么区别?
答:
c++的类的成员默认情况下是私有的,c的struct的成员默认情况下是公共的.
20请讲一讲析构函数和虚函数的用法和作用?
答:
析构函数的作用是当对象生命期结束时释放对象所占用的资源。
析构函数用法:
析构函数是特殊的类成员函数
它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。
只是在类对象生命期结束时有系统自动调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。
21全局变量和局部变量有什么区别?
是怎么实现的?
操作系统和编译器是怎么知道的?
答:
一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。
全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区
22一些寄存器的题目,主要是寻址和内存管理等一些知识。
238086是多少尉的系统?
在数据总线上是怎么实现的?
24多态。
overload和override的区别。
答:
重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。
<>
25.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include
usingnamespacestd;
constintn=8;
main()
{
inti;
intj;
intk;
for(i=n;i>=1;i--)
{
for(j=0;j{
cout<<"*";
for(k=1;k{
cout<<".";
}
}
cout<}
system("pause");
}
26完成程序,实现对数组的降序排序
#include
usingnamespacestd;
voidsort(int*arr,intn);
intmain()
{
intarray[]={45,56,76,234,1,34,23,2,3};
sort(array,9);
for(inti=0;i<=8;i++)//曾经在这儿出界
cout<cout<system("pause");
}
voidsort(int*arr,intn)
{
inttemp;
for(inti=1;i<9;i++)
{
for(intk=0;k<9-i;k++)//曾经在这儿出界
{
if(arr[k]{
temp=arr[k];
arr[k]=arr[k+1];
arr[k+1]=temp;
}
}
}
}
27费波那其数列,1,1,2,3,5……编写程序求第十项。
可以用递归,也可以用其他方法,但要说明你选择的理由。
非递归
#include
usingnamespacestd;
intPheponatch(intn);
main()
{
intPh=Pheponatch(10);
cout<system("pause");
}
intPheponatch(intn)
{
intelem;
intn1=1;
intn2=1;
if(n==1||n==2)
return1;
else
{
for(inti=3;i<=n;i++)
{
elem=n1+n2;
n1=n2;
n2=elem;
}
returnelem;
}
}
递归
#include
usingnamespacestd;
intPheponatch(intn);
main()
{
intn;
cin>>n;
intph=Pheponatch(n);
cout<system("pause");
}
intPheponatch(intn)
{
if(n<=0)
exit(-1);
else
if(n==1||n==2)
return1;
else
returnPheponatch(n-1)+Pheponatch(n-2);
}
28下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
#include
#include
typedefstruct{
TNode*left;
TNode*right;
intvalue;
}TNode;
TNode*root=NULL;
voidappend(intN);
intmain()
{
append(63);
append(45);
append(32);
append(77);
append(96);
append(21);
append(17);//Again,数字任意给出
}
voidappend(intN)
{
TNode*NewNode=(TNode*)malloc(sizeof(TNode));
NewNode->value=N;
if(root==NULL)
{
root=NewNode;
return;
}
else
{
TNode*temp;
temp=root;
while((N>=temp.value&&temp.left!
=NULL)||(N=NULL
))
{
while(N>=temp.value&&temp.left!
=NULL)
temp=temp.left;
while(N=NULL)
temp=temp.right;
}
if(N>=temp.value)
temp.left=NewNode;
else
temp.right=NewNode;
return;
}
}
29.AclassBnetworkontheinternethasasubnetmaskof255.255.240.0,whatisthemaximumnumberofhostspersubnet.
a.240b.255c.4094d.65534
30.Whatisthedifference:
betweeno(logn)ando(logn^2),wherebothlogarithemshavebase2.
a.o(logn^2)isbiggerb.o(logn)isbigger
c.nodifference
31.Foraclasswhatwouldhappenifwecallaclass’sconstructorfromwiththesameclass’sconstructor.
a.compilationerrorb.linkingerror
c.stackoverflowd.noneoftheabove
32.“new”inc++isa:
.
a.libraryfunctionlikemallocinc
b.keywordc.operator
d.noneoftheabove
33.Whichofthefollowinginformationisnotcontainedinaninode.
a.fileownerb.filesize
c.filenamed.diskaddress
34.What’sthenumberofcomparisonsintheworstcasetomergetwosortedlistscontainingnelementseach.
a.2nb.2n-1c.2n+1d.2n-2
35.TimecomplexityofnalgorithmT(n),wherenistheinputsize,isT(n)=T(n-1)+1/nifn>1otherwise1theorderof
thisalgorithmis.
a.log(n)b.nc.n^2d.n^n
36.Thenumberof1’sinthebinaryrepresentationof3*4096+15*256+5*16+3are.
a.8b.9c.10d.12
37.设计函数intatoi(char*s)。
38.inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);输出是多少?
39.解释局部变量、全局变量和静态变量的含义。
40.解释堆和栈的区别。
栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
堆:
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于
链表.
41.论述含参数的宏与函数的优缺点。
42.以下三条输出语句分别输出什么?
[C易]
charstr1[]="abc";
charstr2[]="abc";
constcharstr3[]="abc";
constcharstr4[]="abc";
constchar*str5="abc";
constchar*str6="abc";
cout<cout<cout<43.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?
[C++中等]
答:
a.classB:
publicA{……}//B公有继承自A,可以是间接继承的
b.classB{operatorA();}//B实现了隐式转化为A的转化
c.classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d.A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
44.以下代码中的两个sizeof用法有问题吗?
[C易]
voidUpperCase(charstr[])//将str中的小写字母转换成大写字母
{
for(size_ti=0;iif('a'<=str[i]&&str[i]<='z')
str[i]-=('a'-'A');
}
charstr[]="aBcDe";
cout<<"str字符长度为:
"<UpperCase(str);
cout<45.以下代码有什么问题?
[C难]
voidchar2Hex(charc)//将字符以16进制表示
{
charch=c/0x10+'0';if(ch>'9')ch+=('A'-'9'-1);
charcl=c%0x10+'0';if(cl>'9')cl+=('A'-'9'-1);
cout<}
charstr[]="Ilove中国";
for(size_ti=0;ichar2Hex(str[i]);
cout<46.以下代码有什么问题?
[C++易]
structTest
{
Test(int){}
Test(){}
voidfun(){}
};
voidmain(void)
{
Testa
(1);
a.fun();
Testb();
b.fun();
}
***Testb();//定义了一个函数
47.以下代码有什么问题?
[C++易]
cout<<(true?
1:
"1")<8.以下代码能够编译通过吗,为什么?
[C++易]
unsignedintconstsize1=2;
charstr1[size1];
unsignedinttemp=0;
cin>>temp;
unsignedintconstsize2=temp;
charstr2[size2];
48.以下代码中的输出语句输出0吗,为什么?
[C++易]
structCLS
{
intm_i;
CLS(inti):
m_i(i){}
CLS()
{
CLS(0);
}
};
CLSobj;
cout<49.C++中的空类,默认产生哪些类成员函数?
[C++易]
答:
classEmpty
{
public:
Empty();//缺省构造函数
Empty(constEmpty&);//拷贝构造函数
~Empty();//析构函数
Empty&operator=(constEmpty&);//赋值运算符
Empty*operator&();//取址运算符
constEmpty*operator&()const;//取址运算符const
};
50.以下两条输出语句分别输出什么?
[C++难]
floata=1.0f;
cout<<(int)a<cout<<(int&)a<cout<floatb=0.0f;
cout<<(int)b<cout<<(int&)b<cout<51.以下反向遍历array数组的方法有什么错误?
[STL易]
vectorarray;
array.push_back
(1);
array.push_back
(2);
array.push_back(3);
for(vector:
:
size_typei=array.size()-1;i>=0;--i)//反向遍历array数组
{
cout<}
52.以下代码有什么问题?
[STL易]
typedefvectorIntArray;
IntArrayarray;
array.push_back
(1);
array.push_back
(2);
arr