天天看點

華為C++/MFC面試題(附上個人答案,不當之處請指正)

原文位址:華為C++/MFC面試題(附上個人答案,不當之處請指正)

作者:華仔103

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,%02d.", 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仍然是空指針

      delete pa; /// pa仍然是空指針,pb申請的空間并沒有被delete掉

}

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

}

函數重載:/// 函數重載是指函數名相同,但參數類型或傳回值可能不同的函數。

float add(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  Parameterorder  Clean-upPasses 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();

    }

     returnnRet;

}

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<typename T>

T sum(T a, T b)

{

      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 <iostream>

using namespace std;

class CBase 

{

public:

  virtual void print()

  {

   cout<< "base"<< endl;

  }

  void DoPrint()

  {

   print();

  }

};

class CChild1: public CBase

{

public:

  virtual void print()

  {

   cout<< "child1"<< endl;

  }

};

class CChild2: public CBase

{

public:

  virtual void print()

  {

   cout<< "child2"<< endl;

  }

};

void DoPrint(CBase *base)

{

  base->DoPrint();

}

void main()

{

  CBase* base = new CBase();

  CChild1* child1 = new CChild1();

  CChild2* child2 = new CChild2();

  DoPrint(child1);

  DoPrint(child2);

  DoPrint(base);

  delete base;

  base = child1;

  base->print();

  delete child1;

  delete child2;

}

答:

child1

child2

base

child1

這是C++中類的虛函數實作多态的一個執行個體。