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