阿里面試必會的20道C++面試題與參考答案解析

1、如何初始化一個指針數(shù)組。
解析:首先明確一個概念,就是指向數(shù)組的指針,和存放指針的數(shù)組。 指向數(shù)組的指針:char (*array)[5];含義是一個指向存放5個字符的數(shù)組的指針。 存放指針的數(shù)組:char *array[5];含義是一個數(shù)組中存放了5個指向字符型數(shù)據(jù)的指針。 按照題意,我理解為初始化一個存放指針的數(shù)組,char *array[2]={“China”,”Beijing”};其含義是初始化了一個有兩個指向字符型數(shù)據(jù)的指針的數(shù)組,這兩個指針分別指向字符串”China”和”Beijing”。
2、關(guān)鍵字const是什么含意?
解析:我只要一聽到被面試者說:“const意味著常數(shù)”,我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可 以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這 個問題,我將問他一個附加的問題:下面的聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整 型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型 數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由: 1). 關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理 其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。) 2). 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。 3). 合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。
const關(guān)鍵字至少有下列n個作用:
(1)欲阻止一個變量被改變,可以使用const關(guān)鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數(shù)據(jù)為const,或二者同時指定為const;
(3)在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的成員變量;
(5)對于類的成員函數(shù),有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回結(jié)果必須是一個const對象。如果不是,這樣的變態(tài)代碼也不會編譯出錯:
classA a, b, c; (a * b) = c; // 對a*b的結(jié)果賦值
操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。
3、 什么是動態(tài)特性?
解析:在絕大多數(shù)情況下, 程序的功能是在編譯的時候就確定下來的, 我們稱之為靜態(tài)特性。 反之, 如果程序的功能是在運行時刻才能確定下來的, 則稱之為動態(tài)特性。C++中, 虛函數(shù),抽象基類, 動態(tài)綁定和多態(tài)構(gòu)成了出色的動態(tài)特性。
4、基類的有1個虛函數(shù),子類還需要申明為virtual嗎?為什么。
解析:不申明沒有關(guān)系的。 不過,我總是喜歡顯式申明,使得代碼更加清晰。
5、在C++ 程序中調(diào)用被 C 編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?
解析:函數(shù)和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern “C”修飾的變量和函數(shù)是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調(diào)用C 函數(shù)。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
6、如何定義Bool變量的TRUE和FALSE的值。
解析:不知道這個題有什么陷阱,寫到現(xiàn)在神經(jīng)已經(jīng)大了,一般來說先要把TURE和FALSE給定義了,使用#define就可以: #define TURE 1 #define FALSE 0 如果有一個變量需要定義成bool型的,舉個例子:bool a=TURE;就可以了。
false/true是標準C++語言里新增的關(guān)鍵字,而FALSE/TRUE是通過#define,這要用途
是解決程序在C與C++中環(huán)境的差異,以下是FALSE/TRUE在windef.h的定義:
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過
我們在使用中沒有這種感覺,因為C++會幫你做隱式轉(zhuǎn)換。
7、內(nèi)聯(lián)函數(shù)INline和宏定義一起使用的區(qū)別。
解析:內(nèi)聯(lián)函數(shù)是在編譯的時候已經(jīng)做好將對應(yīng)的函數(shù)代碼替換嵌入到對應(yīng)的位置,適用于代碼較少的函數(shù)。 宏定義是簡單的替換變量,如果定義的是有參數(shù)的函數(shù)形式,參數(shù)不做類型校驗。
8、編寫my_strcpy函數(shù),實現(xiàn)與庫函數(shù)strcpy類似的功能,不能使用任何庫函數(shù);
正確答案:
char *strcpy(char *strDest, const char *strSrc) { if ( strDest == NULL || strSrc == NULL) return NULL ; if ( strDest == strSrc) return strDest ; char *tempptr = strDest ; while( (*strDest++ = *strSrc++) != ‘’); returntempptr ; }
9、 完成程序,實現(xiàn)對數(shù)組的降序排序
#include void sort(int array[] ); int main() { int array[]={45,56,76,234,1,34,23,2,3}; //數(shù)字任//意給出 sort( array ); return 0; } void sort( int array[] ) { inti,j,k; for(i=1;i<=7;i++) { if(array[i]>array[i-1]) { k=ARRAY[i]; j=i-1; do { array[j+1]=array[j]; j– ; } while(k>array[j]&&j>=0); array[j+1]=k; } } }
10、ICMP是什么協(xié)議,處于哪一層?
正確答案:Internet控制報文協(xié)議,處于網(wǎng)絡(luò)層(IP層)
11、 C中static有什么作用
正確答案:
(1)隱藏。 當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數(shù)都具有全局可見性,故使用static在不同的文件中定義同名函數(shù)和同名變量,而不必擔心命名沖突。
(2)static的第二個作用是保持變量內(nèi)容的持久。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量。
(3)static的第三個作用是默認初始化為0.其實全局變量也具備這一屬性,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認值都是0×00,某些時候這一特點可以減少程序員的工作量。
12、
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函數(shù)會有什么樣的結(jié)果?
正確答案: 可以運行
13、C++特點是什么,如何實現(xiàn)多態(tài)?畫出基類和子類在內(nèi)存中的相互關(guān)系。
正確答案:多態(tài)的基礎(chǔ)是繼承,需要虛函數(shù)的支持,簡單的多態(tài)是很簡單的。 子類繼承父類大部分的資源,不能繼承的有構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),operator=函數(shù),友元函數(shù)等等
14、 C++中的什么是多態(tài)性? 是如何實現(xiàn)的?
正確答案:多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計語言繼數(shù)據(jù)抽象和繼承之后的第三個基本特征。它是在運行時出現(xiàn)的多態(tài)性通過派生類和虛函數(shù)實現(xiàn)?;惡团缮愔惺褂猛瑯拥暮瘮?shù)名, 完成不同的操作具體實現(xiàn)相隔離的另一類接口,即把" w h a t"從"h o w"分離開來。多態(tài)性提高了代碼的組織性和可讀性,虛函數(shù)則根據(jù)類型的不同來進行不同的隔離。
15、 關(guān)鍵字static的作用是什么?
正確答案:
這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:
1
). 在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。
2). 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。
3). 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。 大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應(yīng)試者的嚴重的缺點,因為他顯然不懂得本地化數(shù) 據(jù)和代碼范圍的好處和重要性。
16、
#define MAX_LEN 500 char arry[MAX_LEN]; cin>>arry;
這段代碼有問題嗎?若有,請指出并修改;
正確答案:有問題。頭文件缺少。
#include <iostream> using namespace std;
17、delete []arry 和 delete arry 一樣嗎?不一樣請說明;
正確答案:delete []arry 釋放的是多個同一類型的地址空間 Delete arry 釋放的是一個某種類型的地址空間
18、 多態(tài)的作用?
正確答案:
主要是兩個:
1)隱藏實現(xiàn)細節(jié),使得代碼能夠模塊化;擴展代碼模塊,實現(xiàn)代碼重用;
2)接口重用,為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調(diào)用。
19、C語言的volatile的含義是什么。使用時會對編譯器有什么暗示。
正確答案:終于最后一題了,容易么……如果這個測試是一個關(guān)于嵌入式的,那么這道題非常重要??!從詞面上講,volatile的意思是易變的,也就是說,在程序運行過程中,有一些變量可能會被莫名其妙的改變,而優(yōu)化器為了節(jié)約時間,有時候不會重讀這個變量的真實值,而是去讀在寄存器的備份,這樣的話,這個變量的真實值反而被優(yōu)化器給“優(yōu)化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實實去重新讀一遍!可能我說的太“通俗”了,那么我引用一下“大師”的標準解釋: volatile的本意是“易變的” 。 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當要求使用volatile 聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。 精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。 下面是volatile變量的幾個例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個任務(wù)共享的變量 嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災(zāi)難。
20、 請簡述以下兩個for循環(huán)的優(yōu)缺點
1)
for (i=0; i<n; i++) { if (condition) DoSomething(); else DoOtherthing(); }
2)
if (condition) { for (i=0; i<n; i++) DoSomething(); } else { for (i=0; i<n; i++)="" dootherthing();="" }=""
正確答案:
1)優(yōu)點:程序簡潔。="" 缺點:多執(zhí)行了n-1次邏輯判斷,并且打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進行優(yōu)化處理,降低了效率。=""
2)優(yōu)點:循環(huán)的效率高。缺點:程序不簡潔。="
相關(guān)文章
- 這篇文章主要介紹了騰訊公司c++面試小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-03-02
- 這篇文章主要介紹了 C++ 面試題目(整理自牛客網(wǎng)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-02-13
華為校招 C++崗面試經(jīng)歷總結(jié)【筆試+一面+二面+Offer】
這篇文章主要介紹了華為校招 C++崗面試經(jīng)歷,總結(jié)分析了華為校招C++崗位的筆試題,以及一面、二面到最終拿到Offer的經(jīng)歷與相關(guān)經(jīng)驗感想,需要的朋友可以參考下2019-11-28- 這篇文章主要介紹了C++面試常見算法題與參考答案,總結(jié)分析了C++面試中遇到的常見算法題與相應(yīng)的參考答案,需要的朋友可以參考下2019-11-20
- 這篇文章主要介紹了C++必備面試題與參考答案,結(jié)合大量經(jīng)典實例總結(jié)分析了C++面試過程中經(jīng)常遇到的各種概念、原理、算法相關(guān)問題及參考答案,需要的朋友可以參考下2019-10-31
- 這篇文章主要介紹了C/C++經(jīng)典面試題(附答案),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-10-23
- 這篇文章主要介紹了C/C++求職者必備的20道面試題與參考答案,總結(jié)分析了C/C++相關(guān)的常見概念、原理、知識點與注意事項,需要的朋友可以參考下2019-10-10
- 這篇文章主要介紹了騰訊的外包c++面試經(jīng)歷,總結(jié)記錄了一次騰訊C++面試的經(jīng)歷,包括面試的流程、面試題目與相應(yīng)的參考答案,需要的朋友可以參考下2019-09-29
- 這篇文章主要介紹了經(jīng)典C++筆試題目與參考答案,總結(jié)分析了C++常見的各種面試題目,包含C++常見知識點、技術(shù)難點、算法等,需要的朋友可以參考下2019-09-10
- 這篇文章主要介紹了華為筆試算法面試題與參考答案,結(jié)合實例形式分析了基于C++的字符串轉(zhuǎn)換、判斷、排序等算法相關(guān)操作技巧,需要的朋友可以參考下2019-09-05