2024年3月14日发(作者:)

华为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 分 )

int a = 3;

int b = a << 3; ///00000011左移三位为00011000,即24

a = __3__ , b =__24__ 。

3 .请 给出如下程序的结果 (2 分 )

int aaa = 0x01;

htonl(aaa) = _16^6___ 。/// 0x01000000十六进制数,转换为

十进制为16的6次方,即16777216

4 .请给出如下程序的结果 (2 分)

#define MAX_NUM 100+200

int nTemp = MAX_NUM*10;///宏的功能只是简单的字符替换,

MAX_NUM*10表示100+200*10,所以用宏要小心

则 Temp = __2100__ 。

5 .请给出如下程序的结果 (3 分 )

char szTemp[1000] = "";

int nLen1 = sizeof(szTemp);

int nLen2 = strlen(szTemp);///strlen的计算结果不包含结束

符0

strcpy(szTemp, "abc");

int nLen3 = sizeof(szTemp);

int nLen4 = strlen(szTemp);

int nTemp[100];

int *pTemp = nTemp;

int nLen5 = sizeof(pTemp);///在32位系统中,指针只占4位

字节,不管它指向地址的内容有多大!

char szResult[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 分 )

void c(int x) /// 参数为数值传递,不是引用传递

{

char szTemp[10] = "";

x = 2;

sprintf(szTemp, "%d,", x);

afxDump << szTemp; ///afxDump表示输出信息到MFC调试(Debug)

窗口

if(x = 3) ///注意这里不是"=="而是"=",所以if条件是成立的

{

int x = 4;

sprintf(szTemp, "%d,", x);

afxDump << szTemp;

}

sprintf(szTemp, "%d,", x);

afxDump << szTemp;

}

void bbb()

{

char szTemp[10] = "";

int x = 7;

c(x);

sprintf(szTemp, "%d,", x);

afxDump << szTemp;

}

二.改错题 ( 总共 15 分 , 每题 5 分 )。

1 .下面代码有何错误

void func1()

{

int *pa = NULL;

func2(pa); /// 函数返回后pa仍然是空指针

pa; /// pa仍然是空指针,pb申请的空间并没有被掉

}

void func2(int *pb)

{

pb = new int(5); /// pb重新申请了堆空间

}

2 .下面代码有何错误

void func2(int *value)

{

*value = 2; /// value为空指针,不能被取值,所以*value是

错误的

}

void func1()

{

int *p = 0;

func2(p);

}

3 .

int func1(int& b) /// 参数b的类型是整型

{

return 0;

}

void func2()

{

int bbb = 3;

func1(&bbb); ///函数参数的引用调用不需要用符号"&"

func1(bbb);

}

func2 中有何错误, func1 的参数 b 的类型是什么。

三.简答题 (64 分 )

pS:以下答案是随笔所写,请读者做进一步的深入了解。

1. 请简述 C 、 C++ 、 VC 、 MFC 在概念上的区别 (4 分 )

答:C是面向过程编程的语言;

C++是面向对象编程的语言;

VC是微软提供的方便于开发C++程序的一套开发工具。

MFC(Microsoft Function Class),是微软提供的一套函数类库,

里面封装了许多WindowsApI函数,方便开发者调用。

2 .请写一个函数重载的简单例子 (4 分 )

答:

int add(int a,int b)

{

return (a+ b);

}

函数重载:/// 函数重载是指函数名相同,但参数类型或返回值

可能不同的函数。

floatadd(float a,float b)

{

return (a+ b);

}

3. 用什么函数开启新进程、线程。 (4 分 )

答:Createproess()创建进程;

CreateThread()创建线程

MFC中还提供了_beginthread()与_beginthreadex()函数创建线

ssage 和 postMessage 有什么区别 (4 分 )

答:SendMessage:发送消息后,等待消息处理完毕后才继续执行

自身的程序。

postMessage:发送消息后不等待消息处理即继续执行自身的程序。

rSingleObject 有何作用; m_pThrd 的类型是

CWinThread* 时,WaitForSingleObject(m_pThrd->m_hThread,

INFINITE);有何作用。 (4 分 )

答:WaitForSingleObject是表示等待线程的一个函数。

参数为INFINITE表示一直等待线程CWinThread执行结束后,再

继续处理自身程序。

6. __stdcall 、 __cdecl 、 __pascal 在什么方面有所不同。 (4

分 )

答:这些都是一些函数参数的调用约定,告诉编译器函数参数压

栈的顺序,以及压入堆栈的内容由谁来清除,是调用者还是函数本身

清除堆栈的内容。简单列表如下:

Directive parameterorder Clean-uppassesparametersin

registers? pascalLeft-to-rightRoutineNo

cdeclRight-to-leftCallerNo stdcallRight-to-leftRoutineNo

7 .请把下述代码加上异常处理。 (6 分 )

int MyWriteFile(CString strFileName, CString strText)

{

int nRet = 0;

CFile myFile;

(strFileName,CFile::modeWrite|CFile::shareExclus

ive|CFile::modeCreate,NULL);

int nLen = gth();

((char*)(LpCSTR)strText, nLen);

();

return nRet;

}

答:

int MyWriteFile(CString strFileName, CString strText)

{

int nRet = 0;

CFile myFile;

__try

{

nRet= (strFileName,

CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate,NU

LL);

if(!nRet)

{

/// 输出异常信息