華爲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()函數創建線程
Message 和 postMessage 有什麼區別 (4 分 )
答:SendMessage:發送消息後,等待消息處理完畢後才繼續執行自身的程序。
postMessage:發送消息後不等待消息處理即繼續執行自身的程序。
ForSingleObject 有何作用; 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;
(strFileName, CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);
int nLen = ength();
e((char*)(LpCSTR)strText, nLen);
e();
return nRet;
}
答:
int MyWriteFile(CString strFileName, CString strText)
{
int nRet = 0;
CFile myFile;
__try
{
nRet = (strFileName,
CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);
if(!nRet)
{
/// 輸出異常信息
__leave;/// 結束try塊,跳到__finaly代碼塊
}
int nLen = ength();
nRet = e((char*)(LpCSTR)strText, nLen);
if(!nRet)
{
/// 輸出異常信息
__leave;/// 結束try塊,跳到__finaly代碼塊
}
}
__finaly
{
e();
}
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 * ht;
}
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:
-
克服面試中緊張情緒
克服面試中緊張情緒11.演講者應認識到緊張感是演講中的一種自然現象絕大多數的演講者在演講中都不可避免地或多或少伴有緊張感,古今中外,許多的語言大師,如林肯、田中角榮、邱吉爾,他們的第一次演講都是因緊張而以失敗告終的。對此,演講者應該有一個清醒的認識,明確...
-
幼兒園教師的面試
幼兒園教師的面試1各位面試官:你們好,我叫某某,我畢業於某某師範學院幼師專業,這一年21歲,有愛心和責任心,對於不同階段的幼兒,能針對小朋友因材施教。我先後在某某省某某市某某師範大學附屬幼兒園、某某省某某縣幼兒園和某某市某某街外國語學校美樂國際幼稚園這三所...
-
面試時要主動出擊
面試更宜主動出擊無論你是一個多麼高明的求職老手,對於自己鍾情單位的面試,雖表面能從容不迫、侃侃而答,但內心仍是步步爲營、小心謹慎。其實,只要掌握一些看似微不足道的細節,你就能瀟灑自如,維持面試的良好氣氛。善於打破沉默面試開始時,應試者不善破冰(英文直譯即...
-
面試自我評價[優選]
在平時的學習、工作或生活中,我們使用到自我評價的地方非常多,自我評價是人的自我概念的重要內容之一。你所見過的自我評價是什麼樣的呢?以下是小編精心整理的面試自我評價,僅供參考,希望能夠幫助到大家。面試自我評價1你們好,我叫xx,是xx大學平面設計專業的學生,我熱...