华为C++MFC面试题附上个人答案不当之处请指正.docx
- 文档编号:5877421
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:10
- 大小:18.06KB
华为C++MFC面试题附上个人答案不当之处请指正.docx
《华为C++MFC面试题附上个人答案不当之处请指正.docx》由会员分享,可在线阅读,更多相关《华为C++MFC面试题附上个人答案不当之处请指正.docx(10页珍藏版)》请在冰豆网上搜索。
华为C++MFC面试题附上个人答案不当之处请指正
华为C++MFC面试题(附上个人答案不当之处请指正)
pS:
答案是本人随笔所写,可能不全甚至错误!
请不要盲目将其作为标准答案,不当之处,请指正,谢谢。
C++/MFC试题
一.填空题(26分)
1.WIN32平台下,sizeof(short)=__2__,sizeof(int)=__4__,sizeof(long)=__4__。
(3分)///sizeof(char)=1;sizeof(double)=8;sizeof(float)=4;
2.请给出如下程序的结果(2分)
inta=3;
intb=a<<3;///00000011左移三位为00011000,即24
a=__3__,b=__24__。
3.请给出如下程序的结果(2分)
intaaa=0x01;
htonl(aaa)=_16^6___。
///0x01000000十六进制数,转换为十进制为16的6次方,即16777216
4.请给出如下程序的结果(2分)
#defineMAX_NUM100+200
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< if(x=3)///注意这里不是"=="而是"=",所以if条件是成立的 { intx=4; sprintf(szTemp,"%d,",x); afxDump< } sprintf(szTemp,"%d,",x); afxDump< } voidbbb() { charszTemp[10]=""; intx=7; c(x); sprintf(szTemp,"%d,",x); afxDump< } 二.改错题(总共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是错误的 } voidfunc1() { 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) { return(a+b); } 3.用什么函数开启新进程、线程。 (4分) 答: Createproess()创建进程; CreateThread()创建线程 MFC中还提供了_beginthread()与_beginthreadex()函数创建线程 4.SendMessage和postMessage有什么区别(4分) 答: SendMessage: 发送消息后,等待消息处理完毕后才继续执行自身的程序。 postMessage: 发送消息后不等待消息处理即继续执行自身的程序。 5.WaitForSingleObject有何作用;m_pThrd的类型是CWinThread*时,WaitForSingleObject(m_pThrd->m_hThread,INFINITE);有何作用。 (4分) 答: WaitForSingleObject是表示等待线程的一个函数。 参数为INFINITE表示一直等待线程CWinThread执行结束后,再继续处理自身程序。 6.__stdcall、__cdecl、__pascal在什么方面有所不同。 (4分) 答: 这些都是一些函数参数的调用约定,告诉编译器函数参数压栈的顺序,以及压入堆栈的内容由谁来清除,是调用者还是函数本身清除堆栈的内容。 简单列表如下: 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; } 答: intMyWriteFile(CStringstrFileName,CStringstrText) { intnRet=0; CFilemyFile; __try { nRet=myFile.Open(strFileName,\\ CFile: : modeWrite|CFile: : shareExclusive|CFile: : modeCreate,NULL); if(! nRet) { ///输出异常信息 __leave;///结束try块,跳到__finaly代码块 } intnLen=strText.GetLength(); nRet=myFile.Write((char*)(LpCSTR)strText,nLen); if(! nRet) { ///输出异常信息 __leave;///结束try块,跳到__finaly代码块 } } __finaly { myFile.Close(); } returnnRet; } 8.请解释“func”为何种类型,这种类型的作用什么,变量ttt的值是多少? (6分) 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语言不具备),作用是什么? (6分) 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 { public: virtualvoidprint() { cout<<"base"< } voidDoprint() { print(); } }; classCChild1: publicCBase { public: virtualvoidprint() { cout<<"child1"< } }; classCChild2: publicCBase { public: virtualvoidprint() { cout<<"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; base->print(); child1; child2; } 答: child1 child2 base child1 这是C++中类的虚函数实现多态的一个实例。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 MFC 试题 附上 个人 答案 不当 指正