华为C++MFC面试题附上个人答案不当之处请指正Word文档下载推荐.docx
《华为C++MFC面试题附上个人答案不当之处请指正Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华为C++MFC面试题附上个人答案不当之处请指正Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
intnTemp=MAX_NUM*10;
///宏的功能只是简单的字符替换,MAX_NUM*10表示100+200*10,所以用宏要小心
则Temp=__2100__。
5.请给出如下程序的结果(3分)
charszTemp[1000]="
"
;
intnLen1=sizeof(szTemp);
intnLen2=strlen(szTemp);
///strlen的计算结果不包含结束符\\\0\
strcpy(szTemp,"
abc"
);
intnLen3=sizeof(szTemp);
intnLen4=strlen(szTemp);
intnTemp[100];
int*pTemp=nTemp;
intnLen5=sizeof(pTemp);
///在32位系统中,指针只占4位字节,不管它指向地址的内容有多大!
charszResult[200]="
sprintf(szResult,"
%d,%d,%d,%d,d."
nLen1,nLen2,nLen3,nLen4,nLen5);
则szResult=_1000,0,1000,3,04___。
6.MFC中,大部分类是从哪个类继承而来(CCmdTarget、CObject、CWinApp、CWnd)?
(2分)__CObject__
7.内存是进程范围or线程范围;
__进程__///进程有独立的内存,是线程的管理者,线程是进程的执行者
CpU调度时,针对进程or线程;
__线程__///线程才是执行者
函数调用堆栈,针对进程or线程。
_进程___(3分)///进程才有独立内存,堆栈属于内存的一部分
8.调用函数bbb后,输出是什么(4分)
voidc(intx)///参数为数值传递,不是引用传递
{
charszTemp[10]="
x=2;
sprintf(szTemp,"
%d,"
x);
afxDump<
szTemp;
///afxDump表示输出信息到MFC调试(Debug)窗口
if(x=3)///注意这里不是"
=="
而是"
="
,所以if条件是成立的
intx=4;
}
voidbbb()
intx=7;
c(x);
二.改错题(总共15分,每题5分)。
1.下面代码有何错误
voidfunc1()
int*pa=NULL;
func2(pa);
///函数返回后pa仍然是空指针
pa;
///pa仍然是空指针,pb申请的空间并没有被掉
voidfunc2(int*pb)
pb=newint(5);
///pb重新申请了堆空间
2.下面代码有何错误
voidfunc2(int*value)
*value=2;
///value为空指针,不能被取值,所以*value是错误的
int*p=0;
func2(p);
3.
intfunc1(int&
b)///参数b的类型是整型
return0;
voidfunc2()
intbbb=3;
func1(&
bbb);
///函数参数的引用调用不需要用符号"
&
func1(bbb);
func2中有何错误,func1的参数b的类型是什么。
三.简答题(64分)
pS:
以下答案是随笔所写,请读者做进一步的深入了解。
1.请简述C、C++、VC、MFC在概念上的区别(4分)
答:
C是面向过程编程的语言;
C++是面向对象编程的语言;
VC是微软提供的方便于开发C++程序的一套开发工具。
MFC(MicrosoftFunctionClass),是微软提供的一套函数类库,里面封装了许多WindowsApI函数,方便开发者调用。
2.请写一个函数重载的简单例子(4分)
intadd(inta,intb)
return(a+b);
函数重载:
///函数重载是指函数名相同,但参数类型或返回值可能不同的函数。
floatadd(floata,floatb)
3.用什么函数开启新进程、线程。
(4分)
Createproess()创建进程;
CreateThread()创建线程
MFC中还提供了_beginthread()与_beginthreadex()函数创建线程
4.SendMessage和postMessage有什么区别(4分)
SendMessage:
发送消息后,等待消息处理完毕后才继续执行自身的程序。
postMessage:
发送消息后不等待消息处理即继续执行自身的程序。
5.WaitForSingleObject有何作用;
m_pThrd的类型是CWinThread*时,WaitForSingleObject(m_pThrd->
m_hThread,INFINITE);
有何作用。
WaitForSingleObject是表示等待线程的一个函数。
参数为INFINITE表示一直等待线程CWinThread执行结束后,再继续处理自身程序。
6.__stdcall、__cdecl、__pascal在什么方面有所不同。
这些都是一些函数参数的调用约定,告诉编译器函数参数压栈的顺序,以及压入堆栈的内容由谁来清除,是调用者还是函数本身清除堆栈的内容。
简单列表如下:
DirectiveparameterorderClean-uppassesparametersinregisters?
pascalLeft-to-rightRoutineNocdeclRight-to-leftCallerNostdcallRight-to-leftRoutineNo
7.请把下述代码加上异常处理。
(6分)
intMyWriteFile(CStringstrFileName,CStringstrText)
intnRet=0;
CFilemyFile;
myFile.Open(strFileName,CFile:
:
modeWrite|CFile:
shareExclusive|CFile:
modeCreate,NULL);
intnLen=strText.GetLength();
myFile.Write((char*)(LpCSTR)strText,nLen);
myFile.Close();
returnnRet;
__try
nRet=myFile.Open(strFileName,\\
CFile:
if(!
nRet)
///输出异常信息
__leave;
///结束try块,跳到__finaly代码块
nRet=myFile.Write((char*)(LpCSTR)strText,nLen);
__finaly
returnnRet;
8.请解释“func”为何种类型,这种类型的作用什么,变量ttt的值是多少?
typedefint(*func)(int,int*);
intxxx(inta,int*p)
returna+*p;
intdowork(funcaaa,intbbb,int*c)
returnaaa(bbb,c);
intsss=4;
intttt=dowork(&
xxx,3,&
sss);
func表示一个函数指针,它指向参数为int,int*,返回值为int的函数。
ttt的值为7
9.请问下述代码中:
intoperator+(…)起什么作用?
this是什么?
c的值最终为多少?
(6分)
classFruit
public:
Fruit()
weight=2;
Fruit(intw)
weight=w;
intoperator+(Fruitf)
returnthis->
weight*f.weight;
private:
intweight;
};
Fruitaaa;
Fruitbbb(4);
intc=aaa+bbb;
intoperator+(…)表示重载类的“+”号运算符,this表示对象本身的指针,本例中它指向类的对象aaa;
c最终的结果为8(8=2*4)。
10.请解释下面代码采用了何种C++特性(C语言不具备),作用是什么?
template
Tsum(Ta,Tb)
return(a+b);
表示函数模板,用于将一类功能相同,参数类型和返回值不同的函数抽象为一个模板,方便模板函数调用。
11.请解释aaa.h中下面代码的功能(5分)
#if!
defined(AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_)
#defineAFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_
......
#endif
这是预处理命令,可以保证多次包含此头文件时,只编译一次代码。
12.CMemoryState主要功能是什么(5分)
用于检测内存泄露。
13.请阅读下述代码,写出程序执行的结果(6分)
#include
usingnamespacestd;
classCBase
virtualvoidprint()
cout<
"
base"
endl;
voidDoprint()
print();
classCChild1:
publicCBase
child1"
classCChild2:
child2"
voidDoprint(CBase*base)
base->
Doprint();
voidmain()
CBase*base=newCBase();
CChild1*child1=newCChild1();
CChild2*child2=newCChild2();
Doprint(child1);
Doprint(child2);
Doprint(base);
base;
base=child1;
print();
child1;
child2;
child1
child2
base
这是C++中类的虚函数实现多态的一个实例。