C++面试题(八)
客觀題
(1)大端、小端問題,以共用體示例代碼給出
假設計算機的CPU是Intel 32位的,以下代碼輸出結果是什么?
[cpp]?view plaincopy
?
(2)字節對齊問題
下面的結構體占多少個字節?(32位機器上)
[cpp]?view plaincopy那么表達式sizeof(s)=?
答:結果是6
(3)char* p="hello world";與char p[]="hello world";的區別。
(4)指針的問題
?
面試:進程與線程的區別。(面試最后一個問題,居然卡住了,看來得好好看看操作系統了)
?
二、互聯網面試
1、設計模式相關
(1)畫出命令模式的類圖
?
(2)使用C++語言實現單例模式類
?
(3)使用C++語言實現工程模式類
?
2、數據結構和算法
(1)使用C或者C++實現快速排序
C++代碼如下:
[cpp]?view plaincopy參考資料:
快速排序-百度百科
白話經典算法系列之六 快速排序 快速搞定
快速排序算法
?
3、C++語言相關
寫出了幾個類,判斷類所占字節數。
含有純虛函數的類會占用4個字節,空類所占字節數為0
?
4、不調用C語言庫函數,編程實分別實現strcpy、memcpy、memmove。
(1)strcpy
C語言庫函數strcpy的原型如下:
char* strcpy(char *strDestination,const char *strSource);
實現代碼如下:
[cpp]?view plaincopy
?
?
(2)memcpy
C語言庫函數mempy的原型如下:
void *memcpy( void *dest, const void *src, size_t count );
內存復制函數memcpy實現代碼如下:
[cpp]?view plaincopy
(3)memmove
C語言庫函數mempy的原型如下:
void *memmove( void *dest, const void *src, size_tcount?);
功能:由src所指內存區域復制count個字節到dest所指內存區域。
說明:src和dest所指內存區域可以重疊,但復制后src內容會被更改。函數返回指向dest的指針。
內存轉移函數memcpy實現代碼如下:
[cpp]?view plaincopy
?
參考資料:http://blog.csdn.net/yujun_wu/article/details/4999565?
?????????????????面試題之實現系統函數系列一:實現memmove函數
三、服務器端程序員面試
1、dynamic_cast與static_cast的區別。 (C++知識點) 再加上一個const_cast轉換
答:dynamic_cast: 通常在基類和派生類之間轉換時使用,run-time cast 只用于指針和引用。
const_cast: 主要針對const和volatile的轉換.
static_cast: 一般的轉換,no run-time check.? static_cast會檢查一下類型,給你一個警告。
reinterpret_cast: 用于進行沒有任何關聯之間的轉換,比如一個字符指針轉換為一個整形數。
參考文章:http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx
http://blog.csdn.net/boluo1982107/article/details/3239793
2、C++中下列數據類型所占的字節數以及數值表示范圍。
char???? BYTE???? WORD??? DWORD??? unsigned int?? short??
?
3、幾道數據庫題(憑印象回憶吧)
(1)一道選擇題,從product表中選出價格最貴的產品名productName以及價格price。
方法一:select TOP 1 productName,price from product ORDER BY DESEND group br productName
方法二:select productName,price from product where price = (select MAX(price) from product
()聯合查詢和篩選 沒做出來,好久沒使用SQL了。
?
4、MFC中CSocket類能不能用在多個線程中,請說明原因。
?
5、IOCP在服務器中的應用,其特點和優勢是什么,主要解決了什么問題。
6、存儲過程是什么?在ADO和ODBC中存儲過程如何使用?
?
7、說出進程間通訊的幾種方式的名稱。
答:
共享內存
管道
信號量
消息隊列
信號
套接字
# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
# 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
# 信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
# 信號 ( sinal ) : 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生。
# 共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
# 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同及其間的進程通信。
http://www.cnblogs.com/mydomain/archive/2010/09/23/1833369.html
?
8、在C++ 程序中調用被 C編譯器編譯后的函數,為什么要加 extern “C”?
答:C++語言支持函數重載,C語言不支持函數重載。函數被C++編譯后在庫中的名字與C語言的不同。假設某個函數的原型為: void foo(int x, int y);
該函數被C編譯器編譯后在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。
C++提供了C連接交換指定符號extern“C”來解決名字匹配問題。
?
9、內存的思考題(來自林銳博士的《C/C++高質量編程》)
(1)void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)?
{
char *str = NULL;
GetMemory(str);?
strcpy(str, "hello world");
printf(str);
}
請問運行Test函數會有什么樣的結果?
答:程序崩潰。
因為GetMemory并不能傳遞動態內存,
Test函數中的 str一直都是 NULL。
strcpy(str, "hello world");將使程序崩潰。
(2)char *GetMemory(void)
{?
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();?
printf(str);
}
請問運行Test函數會有什么樣的結果?
答:可能是亂碼。
因為GetMemory返回的是指向“棧內存”的指針,該指針的地址不是 NULL,但其原現的內容已經被清除,新內容不可知。
(3)void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");?
printf(str);?
}
請問運行Test函數會有什么樣的結果?
答:
(1)能夠輸出hello
(2)內存泄漏(沒釋放掉已經申請的動態內存)
(4)void Test(void)
{
char *str = (char *) malloc(100);
?strcpy(str, “hello”);
?free(str);?????
?if(str != NULL)
?{
?? strcpy(str, “world”);?
printf(str);
}
}
請問運行Test函數會有什么樣的結果?
答:篡改動態內存區的內容,后果難以預料,非常危險。
因為free(str);之后,str成為野指針,
if(str != NULL)語句不起作用。
10、MFC和STL中均有Hash表類模板,請說明其包含的函數(不要求寫出實際具體的函數名稱),說明其功能即可。
11、下列是線程的偽代碼:
FuctionA()
{
?? LOCK(x)
?? LOCK(y)
?? ......
?? UNLOCK(x)
?? UNLOCK(y)
}
FuctionB()
{
?? LOCK(y)
?? LOCK(x)
?? ......
?? UNLOCK(y)
?? UNLOCK(x)
}
上述兩個線程在執行時會出現線程死鎖,請說出解決上述死鎖問題的幾種解決方案。
?
14、最后是計算一道UDP的丟包率的題目,
客戶端每隔60s發給服務器端1個udp數據包,服務器端在距離上次向服務器端發送應答包超過90s會向客戶端再次發送應答包。
客戶端一共發送了500個udp包,服務器端發送150個包,假設服務器端和客戶端的丟包率相同。
請計算該網絡的丟包率。
具體問題記得不大清楚了。
反正最后是沒做出來。
?
四、VC++程序員面試? 圖像處理
1、QT和C++什么關系,你認為QT和MFC相比有什么異同點,各自的優勢什么?
2、談談VC++中ADO連接數據庫的幾種方式?
3、QT采用的編譯器是什么?(我問了一個問題是:你們為什么使用VC++做圖像處理,而不用QT呢?然后一個技術官反問了我這個問題。)
我直接回答說GCC、CLang、MinGW、VS2008的編譯器什么的。沒有分條理回答。
QT在Windows平臺下一般采用MinGW或VS2008做編譯器;
??? 在Linux系統如Ubuntu等發行版下采用GCC作為編譯器;
??? 在MAC系統下采用GCC或CLang作為編譯器。
然后面試官說錯了,QT是采用GCC作為編譯器,其他平臺需要做移植的,所以我們采用VC++做而不是QT。這點說實話有點沒搞懂。
不過做數字圖像處理、工控系統仿真、網絡游戲,VC++還是比較適合的,這點倒是正常。
這次面試給我的感覺是經驗和表達能力都蠻重要的,三個面試官讓我有點招架不住。
五、一家建筑/工程/結構類的設計公司,應聘職位為MFC軟件開發,筆試題為C++。
1、說明typedef int (*pFun)(int,int *)中pFun的含義,這種類型的用途主要是什么?
pFun被定義為一個指向參數列表為in,int*,返回值為int的函數指針,這種類型即函數指針可以用于定義一種指針類型,指向某種系列類型的函數,通常用于回調函數。
2、以下C++代碼段會輸出什么?
[cpp]?view plaincopy
輸出結果是什么?
答:Base::fun1()
???????Derived::fun2()
分析:主要考察虛函數。
3、最后一道題:判斷一個int類型的整型數字是否為回文數?;匚臄导磸淖笸?#xff0c;從右往左看,數字結果都一樣的數字,例如:232、44、56365等。
使用用C++實現函數bool IsHuiWen(int iNumber);該函數用于判斷一個數字是否為回文數。
代碼如下:
[cpp]?view plaincopy
總結
- 上一篇: 用行为树的方式思考问题
- 下一篇: C++面试(二)