阿里面試必會20道C++面試題

1、如何初始化一個指針數組。

解析:首先明確一個概念,就是指向數組的指針,和存放指針的數組。 指向數組的指針:char (*array)[5];含義是一個指向存放5個字符的數組的指針。 存放指針的數組:char *array[5];含義是一個數組中存放了5個指向字符型數據的指針。 按照題意,我理解為初始化一個存放指針的數組,char *array[2]={“China”,”Beijing”};其含義是初始化了一個有兩個指向字符型數據的指針的數組,這兩個指針分別指向字符串”China”和”Beijing”。

2、關鍵字const是什麼含意?

解析:我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裡完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可 以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這 個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整 型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型 數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由: 1). 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理 其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。) 2). 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。 3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

const關鍵字至少有下列n個作用:

(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了;

(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;

(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4)對於類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;

(5)對於類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:

const classA operator*(const classA& a1,const classA& a2);

operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:

classA a, b, c;

(a * b) = c; // 對a*b的結果賦值

操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。

3、 什麼是動態特性?

解析:在絕大多數情況下, 程序的功能是在編譯的時候就確定下來的, 我們稱之為靜態特性。 反之, 如果程序的功能是在運行時刻才能確定下來的, 則稱之為動態特性。C++中, 虛函數,抽象基類, 動態綁定和多態構成了出色的動態特性。

4、基類的有1個虛函數,子類還需要申明為virtual嗎?為什麼。

解析:不申明沒有關係的。 不過,我總是喜歡顯式申明,使得代碼更加清晰。

5、在C++ 程序中調用被 C 編譯器編譯後的函數,為什麼要加 extern “C”聲明?

解析:函數和變量被C++編譯後在符號庫中的名字與C語言的不同,被extern “C”修飾的變量和函數是按照C語言方式編譯和連接的。由於編譯後的名字不同,C++程序不能直接調用C 函數。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。

6、如何定義Bool變量的TRUE和FALSE的值。

解析:不知道這個題有什麼陷阱,寫到現在神經已經大了,一般來說先要把TURE和FALSE給定義了,使用#define就可以: #define TURE 1 #define FALSE 0 如果有一個變量需要定義成bool型的,舉個例子:bool a=TURE;就可以了。

false/true是標準C++語言裡新增的關鍵字,而FALSE/TRUE是通過#define,這要用途

是解決程序在C與C++中環境的差異,以下是FALSE/TRUE在windef.h的定義:

#ifndef FALSE

#define FALSE 0

#endif

#ifndef TRUE

#define TRUE 1

#endif

也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過

我們在使用中沒有這種感覺,因為C++會幫你做隱式轉換。

7、內聯函數INline和宏定義一起使用的區別。

解析:內聯函數是在編譯的時候已經做好將對應的函數代碼替換嵌入到對應的位置,適用於代碼較少的函數。 宏定義是簡單的替換變量,如果定義的是有參數的函數形式,參數不做類型校驗。

8、編寫my_strcpy函數,實現與庫函數strcpy類似的功能,不能使用任何庫函數;

正確答案:

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、 完成程序,實現對數組的降序排序

#include

void sort(int array[] );

int main()

{

int array[]={45,56,76,234,1,34,23,2,3}; //數字任//意給出

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是什麼協議,處於哪一層?

正確答案:Internet控制報文協議,處於網絡層(IP層)

11、 C中static有什麼作用

正確答案:

(1)隱藏。 當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性,故使用static在不同的文件中定義同名函數和同名變量,而不必擔心命名衝突。

(2)static的第二個作用是保持變量內容的持久。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量。

(3)static的第三個作用是默認初始化為0.其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。在靜態數據區,內存中所有的字節默認值都是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函數會有什麼樣的結果?

正確答案: 可以運行

13、C++特點是什麼,如何實現多態?畫出基類和子類在內存中的相互關係。

正確答案:多態的基礎是繼承,需要虛函數的支持,簡單的多態是很簡單的。 子類繼承父類大部分的資源,不能繼承的有構造函數,析構函數,拷貝構造函數,operator=函數,友元函數等等

14、 C++中的什麼是多態性? 是如何實現的?

正確答案:多態性是面向對象程序設計語言繼數據抽象和繼承之後的第三個基本特徵。它是在運行時出現的多態性通過派生類和虛函數實現。基類和派生類中使用同樣的函數名, 完成不同的操作具體實現相隔離的另一類接口,即把" w h a t"從"h o w"分離開來。多態性提高了代碼的組織性和可讀性,虛函數則根據類型的不同來進行不同的隔離。

15、 關鍵字static的作用是什麼?

正確答案:

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:

1). 在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

2). 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

3). 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。 大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數 據和代碼範圍的好處和重要性。

16、#define MAX_LEN 500 char arry[MAX_LEN]; cin>>arry; 這段代碼有問題嗎?若有,請指出並修改;

正確答案:有問題。頭文件缺少。 #include <iostream> using namespace std;/<iostream>

17、delete []arry 和 delete arry 一樣嗎?不一樣請說明;

正確答案:delete []arry 釋放的是多個同一類型的地址空間 Delete arry 釋放的是一個某種類型的地址空間

18、 多態的作用?

正確答案:

主要是兩個:

1)隱藏實現細節,使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;

2)接口重用,為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用。

19、C語言的volatile的含義是什麼。使用時會對編譯器有什麼暗示。

正確答案:終於最後一題了,容易麼……如果這個測試是一個關於嵌入式的,那麼這道題非常重要!!從詞面上講,volatile的意思是易變的,也就是說,在程序運行過程中,有一些變量可能會被莫名其妙的改變,而優化器為了節約時間,有時候不會重讀這個變量的真實值,而是去讀在寄存器的備份,這樣的話,這個變量的真實值反而被優化器給“優化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實實去重新讀一遍!可能我說的太“通俗”了,那麼我引用一下“大師”的標準解釋: volatile的本意是“易變的” 。 由於訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化,但有可能會讀髒數據。當要求使用volatile 聲明的變量的值的時候,系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據。而且讀取的數據立刻被保存。 精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裡的備份。 下面是volatile變量的幾個例子:

1). 並行設備的硬件寄存器(如:狀態寄存器)

2). 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)

3). 多線程應用中被幾個任務共享的變量 嵌入式系統程序員經常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內容將會帶來災難。

20、 請簡述以下兩個for循環的優缺點

1)for (i=0; i

{

if (condition)

DoSomething();

else

DoOtherthing();

}

2)if (condition)

{

for (i=0; i

DoSomething();

}

else

{

for (i=0; i

正確答案:

1)優點:程序簡潔。="" 缺點:多執行了n-1次邏輯判斷,並且打斷了循環“流水線”作業,使得編譯器不能對循環進行優化處理,降低了效率。=""

2)優點:循環的效率高。缺點:程序不簡潔。="

注:C/C++ linux服務器開發免費資料後臺私信;資料;即可


分享到:


相關文章: