閱讀屋>面試> 華為C++/MFC面試題

華為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 分 )

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的計算結果不包含結束符\

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 ccc(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;

ccc(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),是微軟提供的一套函式類庫,裡面封裝了許多Windows ApI函式,方便開發者呼叫。

2 .請寫一個函式過載的簡單例子 (4 分 )

答:

int add(int a,int b)

{

return (a + b);

}

函式過載:/// 函式過載是指函式名相同,但引數型別或返回值可能不同的函式。

floatadd(float a,float b)

{

return (a + b);

}

3. 用什麼函式開啟新程序、執行緒。 (4 分 )

答:Createproccess()建立程序;

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

答:這些都是一些函式引數的呼叫約定,告訴編譯器函式引數壓棧的順序,以及壓入堆疊的內容由誰來清除,是呼叫者還是函式本身清除堆疊的內容。簡單列表如下:

Directive parameter order Clean-up passes parameters in registers?

pascal Left-to-right Routine No

cdecl Right-to-left Caller No

stdcall Right-to-left Routine No

7 .請把下述程式碼加上異常處理。 (6 分 )

int MyWriteFile(CString strFileName, CString strText)

{

int nRet = 0;

CFile myFile;

myFile.Open(strFileName, CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);

int nLen = strText.GetLength();

myFile.Write((char*)(LpCSTR)strText, nLen);

myFile.Close();

return nRet;

}

答:

int MyWriteFile(CString strFileName, CString strText)

{

int nRet = 0;

CFile myFile;

__try

{

nRet = myFile.Open(strFileName,\

CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);

if(!nRet)

{

/// 輸出異常資訊

__leave;/// 結束try塊,跳到__finaly程式碼塊

}

int nLen = strText.GetLength();

nRet = myFile.Write((char*)(LpCSTR)strText, nLen);

if(!nRet)

{

/// 輸出異常資訊

__leave;/// 結束try塊,跳到__finaly程式碼塊

}

}

__finaly

{

myFile.Close();

}

return nRet;

}

8 .請解釋“ func ”為何種型別,這種型別的作用什麼,變數 ttt 的值是多少? (6 分 )

typedef int (*func)(int, int*);

int xxx(int a, int *p)

{

return a + *p;

}

int dowork(func aaa, int bbb, int *ccc)

{

return aaa(bbb, ccc);

}

int sss = 4;

int ttt = dowork(&xxx, 3, &sss);

答:func表示一個函式指標,它指向引數為int,int*,返回值為int的函式。ttt的值為7

9 .請問下述程式碼中 : int operator+(… )起什麼作用? this 是什麼? ccc 的值最終為多少? (6 分 )

class Fruit

{

public:

Fruit()

{

weight = 2;

}

Fruit(int w)

{

weight = w;

}

int operator+(Fruit f)

{

return this->weight * f.weight;

}

private:

int weight;

};

Fruit aaa;

Fruit bbb(4);

int ccc = aaa + bbb;

答:int operator+(… )表示過載類的“+”號運算子,this表示物件本身的指標,本例中它指向類的物件aaa;ccc最終的結果為8(8 = 2 * 4)。

10. 請解釋下面程式碼採用了何種 C++ 特性( C 語言不具備),作用是什麼? (6 分 )

template

T sum(T a, T b)

{

return (a + b);

}

答:表示函式模板,用於將一類功能相同,引數型別和返回值不同的函式抽象為一個模板,方便模板函式呼叫。

11 .請解釋 aaa.h 中下面程式碼的功能 (5 分 )

#if !defined(AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_)

#define AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_

... ...

#endif

答:這是預處理命令,可以保證多次包含此標頭檔案時,只編譯一次程式碼。

12 . CMemoryState 主要功能是什麼 (5 分 )

答:用於檢測記憶體洩露。

13 .請閱讀下述程式碼,寫出程式執行的結果( 6 分)

#include

using namespace std;

class CBase

{

public:

virtual void print()

{

cout<< "base" << endl;

}

void Doprint()

{

print();

}

};

class CChild1: public CBase

{

public:

【華為C++/MFC面試題】相關文章: