C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
一、【阿里C++面試題】
1、如何初始化一個指針數(shù)組。
答案:
c++中的指針是一個很經(jīng)典的用法,但是也是最容易出錯的,比如定義了一個指針,必須對其進(jìn)行初始化,不然這個指針指向的是一個未知的內(nèi)存地址,后續(xù)對其操作的時候,會報(bào)錯。這只是其次,最讓人頭疼的就是指針錯誤問題,往往編譯的時候可以通過,在程序運(yùn)行的時候,就會出現(xiàn)異常,如果對程序不是很熟悉,則不是很容易找到問題所在,我最近就遇到過很多這樣的問題,定義了一個結(jié)構(gòu)體指針,使用的時候忘記初始化,導(dǎo)致在后邊使用的時候程序報(bào)異常。下面就總結(jié)一下c++指針初始化的一些方法,
以及我自己遇到的一些問題以及心得體會。
一.c++指針初始化的一般方法:
1.將一個已經(jīng)在內(nèi)存中存在變量的地址傳遞給定義的指針,這個指針就指向這個變量的內(nèi)存地址(相同的數(shù)據(jù)類型),完成初始化。
比如:
int a=2; int *b=&a;2.利用new開辟一塊地址空間
struct test{int a;int b; }*t;void main() {int c=0;test *t=new test();c=t->a; }使用 new開辟的空間,記得使用delete釋放,因?yàn)閚ew出來的是返回的堆的空間,堆的空間是不會自動釋放的,存放變量的棧才會自動釋放。delete釋放其實(shí)只是釋放了申請的這塊內(nèi)存空間,但是指針并沒有沒撤銷,指針還是指向這塊地址,但是不可用(靠人品吃飯的有可能可以用),是非法的。所以用delete釋放掉一塊堆內(nèi)存時,應(yīng)該自己手動將指針設(shè)置為NULL。
3.把指針設(shè)置為NULL或者0
這樣做一般只是為了沒有具體初始化的時候做的,這樣避免了野指針,后面可以使用if(指針==NULL)來判斷,然后再進(jìn)行操作。
錯題解析:首先明確一個概念,就是指向數(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是什么含意?
正確答案:
在標(biāo)準(zhǔn)C++中,這樣定義的是一個常量,用來修飾內(nèi)置類型變量,自定義對象,成員函數(shù),返回值,函數(shù)參數(shù)。
const使用(類型):
1、用于指針的兩種情況:const是一個左結(jié)合的類型修飾符.
int const*A;//A可變,A不可變
intconst A;//A不可變,*A可變
2、限定函數(shù)的傳遞值參數(shù):
void function(const int Var);//傳遞過來的參數(shù)在函數(shù)內(nèi)不可以改變.
3、限定函數(shù)返回值型.
const int function();//此時const無意義
const myclassname function();//函數(shù)返回自定義類型myclassname.
4、限定函數(shù)類型.
void function()const;//常成員函數(shù),常成員函數(shù)是不能改變成員變量值的函數(shù)。
錯題解析:我只要一聽到被面試者說:“const意味著常數(shù)”,我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可 以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下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的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理 其它人留下的垃圾,你就會很快學(xué)會感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。) 2). 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。 3). 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。
3、 什么是動態(tài)特性?
正確答案:
在絕大多數(shù)情況下,程序的功能是在編譯的時候就確定下來的,我們稱為靜態(tài)特性。反之,如果程序的功能是在運(yùn)行時刻才確定下來的,則稱為動態(tài)特性。
動態(tài)特性是面向?qū)ο笳Z言最強(qiáng)大的功能之一,因?yàn)樗谡Z言層面上支持程序的可擴(kuò)展性,而可擴(kuò)展性是軟件設(shè)計(jì)追求的重要目標(biāo)之一。
c++虛函數(shù)、抽象基類、動態(tài)綁定、多態(tài)構(gòu)成了出色的動態(tài)特性。
1.虛函數(shù)
假定幾何形狀的基類為Shape,其派生類有Circle、Rectangle、Ellipse等,每個派生類都能夠繪制自己所代表的形狀。不管派生類的形狀如何,我們希望用統(tǒng)一的方式來調(diào)用繪制函數(shù),最好是使用Shape定義的接口函數(shù)Draw(),并讓程序在運(yùn)行是動態(tài)地確定應(yīng)該使用哪一個派生類的Draw()函數(shù)。
為了使這種行為可行,我們把基類Shape中的函數(shù)Draw()聲明為虛函數(shù),然后在派生類中重新定義Draw()使之繪制正確的形狀,這種方法叫覆蓋,虛函數(shù)的聲明方法是在基類的函數(shù)原型之前加上關(guān)鍵之virtual。
一旦類的一個函數(shù)被聲明為虛函數(shù),那么其派生類的對應(yīng)函數(shù)也自動成為虛函數(shù),這樣一級一級傳遞下去。
2.抽象基類
當(dāng)我們把類看成是一種數(shù)據(jù)類型時,通常會認(rèn)為該類肯定是要被實(shí)例為一個或多個對象的。但是在很多情況下,定義那些不能實(shí)例化出對象的類也是很有用的,這種類就稱為抽象類。抽象類的唯一目的就是讓其派生類繼承并實(shí)現(xiàn)它的接口方法,因此它通常也被稱為抽象基類。
如果將基類的虛函數(shù)聲明為春虛函數(shù),那么該類就被定義為了抽象基類。純虛函數(shù)是在聲明時將其“初始化”為0的函數(shù),例如:
class Shape { //Shape是抽象基類public:virtual void Draw(void)=0; //Draw()為純虛函數(shù)}`抽象基類Shape的純虛函數(shù)Draw()根本不知道自己應(yīng)該怎么繪制出一個“形狀”來,具體功能必須有代表具體形狀的派生類對應(yīng)的Draw()函數(shù)來實(shí)現(xiàn)。
我們知道,函數(shù)名就是函數(shù)的地址,將一個函數(shù)初始化為0意味著函數(shù)的地址將為0,這就是在告訴編譯器,不要為該函數(shù)編址,從而阻止該類的實(shí)例化行為。
抽象基類的主要用途是“接口與實(shí)現(xiàn)分離”;不僅要把數(shù)據(jù)成員(信息)隱藏起來,而且還要把實(shí)現(xiàn)完全隱藏起來,只留一些接口給外部調(diào)用。
錯題解析:在絕大多數(shù)情況下, 程序的功能是在編譯的時候就確定下來的, 我們稱之為靜態(tài)特性。 反之, 如果程序的功能是在運(yùn)行時刻才能確定下來的, 則稱之為動態(tài)特性。C++中, 虛函數(shù),抽象基類, 動態(tài)綁定和多態(tài)構(gòu)成了出色的動態(tài)特性。
4、基類的有1個虛函數(shù),子類還需要申明為virtual嗎?為什么。
正確答案:建議加上vitrual,代碼是寫給人看的
錯題解析:不申明沒有關(guān)系的。 不過,我總是喜歡顯式申明,使得代碼更加清晰。
5、在C++ 程序中調(diào)用被 C 編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?
正確答案:
c語言程序和c++程序在編譯時,是相互獨(dú)立的編譯;在.c文件中,編譯器將Add函數(shù)重命名為_Add; 而在.cpp文件中,編譯器將用extern聲明的函數(shù)重命名為(?Add@@YAHHH@Z);那么在鏈接階段,在_mian函數(shù)中該Add函數(shù)被調(diào)用;
此時編譯器帶著(?Add@@YAHHH@Z)函數(shù)名進(jìn)入test.c文件的編譯文件中去尋找(?Add@@YAHHH@Z)函數(shù),但是在test.c文件中這個Add函數(shù)被編譯器重命名為_Add,由于在.cpp文件中和.c文件中同一個函數(shù)名被編譯器重命名后的名字不一樣;所以.cpp文件聲明的外部函數(shù)找不到真正定義的地方;程序錯誤;
(2)使用extern “C” int Add(int,int); 外部函數(shù)—-正確
解釋:
c++語言為了支持重載,對編譯時函數(shù)的重命名規(guī)則進(jìn)行更改,
使用extern “C” 的方式在c++程序中聲明c語言文件中的函數(shù),可以在編譯時,告訴編譯器使用C語言的規(guī)則對該函數(shù)的的函數(shù)名的進(jìn)行重命名,這樣在鏈接的時候,就可以順利在.c文件中找到該函數(shù);
錯題解析:函數(shù)和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern “C”修飾的變量和函數(shù)是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調(diào)用C 函數(shù)。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
6、如何定義Bool變量的TRUE和FALSE的值。
正確答案:
對于C語言,并不存在系統(tǒng)自帶的bool類型和False和Ture的定義,如果要使用則必須自定義類型。
有兩種常見的方法。
1、使用宏定義。
通過define來進(jìn)行定義False和True。可以采用如下方式:
(1) 直接定義數(shù)值
(2) 通過邏輯判斷定義
#define False (1!=1) #define True (1==1)2、使用枚舉定義。
這種方法可以同時定義類型BOOL
錯題解析:不知道這個題有什么陷阱,寫到現(xiàn)在神經(jīng)已經(jīng)大了,一般來說先要把TURE和FALSE給定義了,使用#define就可以: #define TURE 1 #define FALSE 0 如果有一個變量需要定義成bool型的,舉個例子:bool a=TURE;就可以了。
7、內(nèi)聯(lián)函數(shù)INline和宏定義一起使用的區(qū)別。
正確答案:
1、宏定義不會進(jìn)行類型的判斷,只是單存的替換文本;
inline會對參數(shù)類型進(jìn)行判斷。
2、宏不是函數(shù),inline修飾的是函數(shù)。
3、宏返回值不能強(qiáng)制轉(zhuǎn)換成合適的類型,inline返回值可以。
錯題解析:內(nèi)聯(lián)函數(shù)是在編譯的時候已經(jīng)做好將對應(yīng)的函數(shù)代碼替換嵌入到對應(yīng)的位置,適用于代碼較少的函數(shù)。 宏定義是簡單的替換變量,如果定義的是有參數(shù)的函數(shù)形式,參數(shù)不做類型校驗(yàn)。
8、編寫my_strcpy函數(shù),實(shí)現(xiàn)與庫函數(shù)strcpy類似的功能,不能使用任何庫函數(shù);
正確答案:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
returnstrDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘’);
returntempptr ;
}
9、 完成程序,實(shí)現(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控制報(bào)文協(xié)議,處于網(wǎng)絡(luò)層(IP層)
11、 C中static有什么作用
正確答案:
(1)隱藏。 當(dāng)我們同時編譯多個文件時,所有未加static前綴的全局變量和函數(shù)都具有全局可見性,故使用static在不同的文件中定義同名函數(shù)和同名變量,而不必?fù)?dān)心命名沖突。
(2)static的第二個作用是保持變量內(nèi)容的持久。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運(yùn)行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量。
(3)static的第三個作用是默認(rèn)初始化為0.其實(shí)全局變量也具備這一屬性,因?yàn)槿肿兞恳泊鎯υ陟o態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0×00,某些時候這一特點(diǎn)可以減少程序員的工作量。
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);
}
請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
正確答案:
可以運(yùn)行
13、C++特點(diǎn)是什么,如何實(shí)現(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)性? 是如何實(shí)現(xiàn)的?
正確答案:
多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言繼數(shù)據(jù)抽象和繼承之后的第三個基本特征。它是在運(yùn)行時出現(xiàn)的多態(tài)性通過派生類和虛函數(shù)實(shí)現(xiàn)。基類和派生類中使用同樣的函數(shù)名, 完成不同的操作具體實(shí)現(xiàn)相隔離的另一類接口,即把" w h a t"從"h o w"分離開來。多態(tài)性提高了代碼的組織性和可讀性,虛函數(shù)則根據(jù)類型的不同來進(jìn)行不同的隔離。
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)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù) 據(jù)和代碼范圍的好處和重要性。
16、#define MAX_LEN 500 char arry[MAX_LEN]; cin>>arry; 這段代碼有問題嗎?若有,請指出并修改;
正確答案:
有問題。頭文件缺少。 #include
17、delete []arry 和 delete arry 一樣嗎?不一樣請說明;
正確答案:
delete []arry 釋放的是多個同一類型的地址空間 Delete[]arry 釋放的是一個某種類型的地址空間
18、 多態(tài)的作用?
正確答案:
主要是兩個:
1)隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;
2)接口重用,為了類在繼承和派生的時候,保證使用家族中任一類的實(shí)例的某一屬性時的正確調(diào)用。
19、C語言的volatile的含義是什么。使用時會對編譯器有什么暗示。
正確答案:
從詞面上講,volatile的意思是易變的,也就是說,在程序運(yùn)行過程中,有一些變量可能會被莫名其妙的改變,而優(yōu)化器為了節(jié)約時間,有時候不會重讀這個變量的真實(shí)值,而是去讀在寄存器的備份,這樣的話,這個變量的真實(shí)值反而被優(yōu)化器給“優(yōu)化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實(shí)實(shí)去重新讀一遍!可能我說的太“通俗”了,那么我引用一下“大師”的標(biāo)準(zhǔn)解釋: volatile的本意是“易變的” 。 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用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)缺點(diǎn)
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)點(diǎn):程序簡潔。=“” 缺點(diǎn):多執(zhí)行了n-1次邏輯判斷,并且打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。=“”
2)優(yōu)點(diǎn):循環(huán)的效率高。缺點(diǎn):程序不簡潔。="
二、【百度C++面試題】
1、 預(yù)處理器標(biāo)識#error的目的是什么?
正確答案:
如果你不知道答案,請看參考文獻(xiàn)1。
2、C語言的volatile的含義是什么。使用時會對編譯器有什么暗示。
正確答案:
從詞面上講,volatile的意思是易變的,也就是說,在程序運(yùn)行過程中,有一些變量可能會被莫名其妙的改變,而優(yōu)化器為了節(jié)約時間,有時候不會重讀這個變量的真實(shí)值,而是去讀在寄存器的備份,這樣的話,這個變量的真實(shí)值反而被優(yōu)化器給“優(yōu)化”掉了,用時髦的詞說就是被“和諧”了。如果使用了這個修飾詞,就是通知編譯器別犯懶,老老實(shí)實(shí)去重新讀一遍!可能我說的太“通俗”了,那么我引用一下“大師”的標(biāo)準(zhǔn)解釋: volatile的本意是“易變的” 。 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用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)難。
3、 MFC中CString是類型安全類么?
正確答案:
不是,其它數(shù)據(jù)類型轉(zhuǎn)換到CString可以使用CString的成員函數(shù)Format來轉(zhuǎn)換
4、內(nèi)聯(lián)函數(shù)INline和宏定義一起使用的區(qū)別。
正確答案:
內(nèi)聯(lián)函數(shù)是在編譯的時候已經(jīng)做好將對應(yīng)的函數(shù)代碼替換嵌入到對應(yīng)的位置,適用于代碼較少的函數(shù)。 宏定義是簡單的替換變量,如果定義的是有參數(shù)的函數(shù)形式,參數(shù)不做類型校驗(yàn)。
5、C++中什么數(shù)據(jù)分配在?;蚨阎?#xff0c;New分配數(shù)據(jù)是在近堆還是遠(yuǎn)堆中?
正確答案:
棧: 存放局部變量,函數(shù)調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理 堆: 程序運(yùn)行時動態(tài)申請,new 和 malloc申請的內(nèi)存就在堆上
6、DB事務(wù)處理的四個特性:
正確答案:
原子性,一致性,隔離性,持久性 就答對一個:一致性,
7、如何初始化一個指針數(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”。
8、 int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少?
正確答案:
相當(dāng)于 i=j=4;i=k=8;i=l=16;i=m=32; 故最后i=32;
9、如何在C中初始化一個字符數(shù)組。
正確答案:
這個問題看似很簡單,但是我們要將最簡單的問題用最嚴(yán)謹(jǐn)?shù)膽B(tài)度來對待。關(guān)鍵的地方:初始化、字符型、數(shù)組。最簡單的方法是char array[];。這個問題看似解決了,但是在初始化上好像還欠缺點(diǎn)什么,個人認(rèn)為:char array[5]={’1′,’2′,’3′,’4′,’5′};或者char array[5]={“12345″};或者char array[2][10]={“China”,”Beijing”};也許更符合“初始化”的意思。
10、參數(shù)傳遞有幾種方式;實(shí)現(xiàn)多態(tài)參數(shù)傳遞采用什么方式,如果沒有使用某種方式原因是什么;
正確答案:
傳值,傳指針或者引用
11、請?zhí)顚態(tài)OOL , float, 指針變量 與“零值”比較的 if 語句。
正確答案:
這里“零值”可以是0, 0.0 , FALSE或者“空指針”。例如 int 變量 n 與“零值”比較的 if 語句為:
12、C++特點(diǎn)是什么,如何實(shí)現(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ù)等等
13、 什么是“引用”?申明和使用“引用”要注意哪些問題?
正確答案:
引用就是某個目標(biāo)變量的“別名”(alias),對應(yīng)用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進(jìn)行初始化。引 用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只 表示該引用名是目標(biāo)變量名的一個別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。不能建立數(shù)組的引用。
14、觸發(fā)器怎么工作的?
正確答案:
觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,當(dāng)對某一表進(jìn)行諸如UPDATE、 INSERT、 DELETE 這些操作時,數(shù)據(jù)庫就會自動執(zhí)行觸發(fā)器所定義的SQL 語句,從而確保對數(shù)據(jù)的處理必須符合由這些SQL 語句所定義的規(guī)則。
15、C也可以通過精心封裝某些函數(shù)功能實(shí)現(xiàn)重用,那C++的類有什么優(yōu)點(diǎn)嗎,難道僅僅是為實(shí)現(xiàn)重用。
正確答案:
并不僅僅是這樣的。 OOD,OOP從根本上改變了程序設(shè)計(jì)模式和設(shè)計(jì)思想,具備重大和深遠(yuǎn)的意義。 類的三大最基本的特征:封裝,繼承,多態(tài).
16、CSingleLock是干什么的。
正確答案:
同步多個線程對一個數(shù)據(jù)類的同時訪問
17、 C++中引用和指針的區(qū)別?
正確答案:
引用是對象的別名, 操作引用就是操作這個對象, 必須在創(chuàng)建的同時有效得初始化(引用一個有效的對象, 不可為NULL), 初始化完畢就再也不可改變, 引用具有指針的效率, 又具有變量使用的方便性和直觀性, 在語言層面上引用和對象的用法一樣, 在二進(jìn)制層面上引用一般都是通過指針來實(shí)現(xiàn)的, 只是編譯器幫我們完成了轉(zhuǎn)換。 之所以使用引用是為了用適當(dāng)?shù)墓ぞ咦銮∪缙浞值氖?#xff0c; 體現(xiàn)了最小特權(quán)原則。
18、 C與C++各自是如何定義常量的?有什么不同?
正確答案:
C中是使用宏#define定義, C++使用更好的const來定義。 區(qū)別: 1)const是有數(shù)據(jù)類型的常量,而宏常量沒有,編譯器可以對前者進(jìn)行靜態(tài)類型安全檢查,對后者僅是字符替換,沒有類型安全檢查,而且在字符替換時可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。 2)有些編譯器可以對const常量進(jìn)行調(diào)試, 不能對宏調(diào)試。
19、 C++函數(shù)中值的傳遞方式有哪幾種?
正確答案:
C++函數(shù)的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞。
20、一般數(shù)據(jù)庫若出現(xiàn)日志滿了,會出現(xiàn)什么情況,是否還能使用?
正確答案:
只能執(zhí)行查詢等讀操作,不能執(zhí)行更改,備份等寫操作,原因是任何寫操作都要記錄日志。也就是說基本上處于不能使用的狀態(tài)。
三、【騰訊C++面試題】
1、.C++里面如何聲明constvoidf(void)函數(shù)為C程序中的庫函數(shù)?
正確答案:
在該函數(shù)前添加extern “C”聲明。由于編譯后的名字不同,C++程序不能直接調(diào)用C 函數(shù)。
2、c++中類和c語言中struct的區(qū)別(至少兩點(diǎn))
正確答案:
(1)c++中的類默認(rèn)的成員是私有的,struct默認(rèn)的是共有的。
(2)c++中的類可以定義成員函數(shù),struct只能定義成員變量。
(3)C++中的類有繼承、多態(tài)的特性,struct沒有。
3、IP組播有那些好處?
正確答案:
Internet上產(chǎn)生的許多新的應(yīng)用,特別是高帶寬的多媒體應(yīng)用,帶來了帶寬的急劇消耗和網(wǎng)絡(luò)擁擠問題。組播是一種允許一個或多個發(fā)送者(組播源)發(fā)送單一的數(shù)據(jù)包到多個接收者(一次的,同時的)的網(wǎng)絡(luò)技術(shù)。組播可以大大的節(jié)省網(wǎng)絡(luò)帶寬,因?yàn)闊o論有多少個目標(biāo)地址,在整個網(wǎng)絡(luò)的任何一條鏈路上只傳送單一的數(shù)據(jù)包。所以說組播技術(shù)的核心就是針對如何節(jié)約網(wǎng)絡(luò)資源的前提下保證服務(wù)質(zhì)量。
4、變量的聲明和定義有什么區(qū)別?
正確答案:
聲明變量不分配空間,定義變量要分配空間。聲明主要是告訴編譯器,后面的引用都按聲明的格式。定義其實(shí)包含了聲明的意思,同時要分配內(nèi)存空間。
5、程序什么時候應(yīng)該使用線程,什么時候單線程效率高。
正確答案:
1 耗時的操作使用線程,提高應(yīng)用程序響應(yīng)
2 并行操作時使用線程,如C/S架構(gòu)的服務(wù)器端并發(fā)線程響應(yīng)用戶的請求。
3 多CPU系統(tǒng)中,使用線程提高CPU利用率
4 改善程序結(jié)構(gòu)。一個既長又復(fù)雜的進(jìn)程可以考慮分為多個線程,成為幾個獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會利于理解和修改。
其他情況都使用單線程。
6、介紹一下模板和容器。如何實(shí)現(xiàn)?(也許會讓你當(dāng)場舉例實(shí)現(xiàn))
正確答案:
模板可以說比較古老了,但是當(dāng)前的泛型編程實(shí)質(zhì)上就是模板編程。 它體現(xiàn)了一種通用和泛化的思想。 STL有7種主要容器:vector,list,deque,map,multimap,set,multiset.
7、以下為WindowsNT下的32位C++程序,請計(jì)算sizeof的值
charstr[]=“Hello”;
charp=str;
intn=10;
//請計(jì)算
sizeof(str)=?
sizeof§=?
sizeof(n)=?
voidFunc(charstr[100])
{
//請計(jì)算
sizeof(str)=?
}
voidp=malloc(100);
//請計(jì)算
sizeof§=?
正確答案:
sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) =4
void Func ( char str[100])
{
sizeof( str ) = 4
}
void *p = malloc( 100 );
sizeof ( p ) =4
8、C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?inta=5,b=7,c;c=a+++b;
正確答案:
這個問題將做為這個測驗(yàn)的一個愉快的結(jié)尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實(shí)際上會爭論這個問題,根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成: c = a++ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當(dāng)作問題。我發(fā)現(xiàn)這個問題的最大好處是:這是一個關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題
9、#include與#include“file.h”的區(qū)別?
正確答案:
前者是從Standard Library的路徑尋找和引用file.h,而后者是從當(dāng)前工作路徑搜尋并引用file.h。
10、如何在C中初始化一個字符數(shù)組。
正確答案:
這個問題看似很簡單,但是我們要將最簡單的問題用最嚴(yán)謹(jǐn)?shù)膽B(tài)度來對待。關(guān)鍵的地方:初始化、字符型、數(shù)組。最簡單的方法是char array[];。這個問題看似解決了,但是在初始化上好像還欠缺點(diǎn)什么,個人認(rèn)為:char array[5]={’1′,’2′,’3′,’4′,’5′};或者char array[5]={“12345″};或者char array[2][10]={“China”,”Beijing”};也許更符合“初始化”的意思。
11、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”?
正確答案:
extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。 通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲明。
12、內(nèi)存的分配方式的分配方式有幾種?
正確答案:
1)從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運(yùn)行期間都存在。例如全局變量。
2)在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
3)從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問題也最多。
13、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern"C"?
正確答案:
C++語言支持函數(shù)重載,C語言不支持函數(shù)重載。函數(shù)被C++編譯后在庫中的名字與C語言的不同。假設(shè)某個函數(shù)的原型為: void foo(int x, int y);該函數(shù)被C編譯器編譯后在庫中的名字為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字。C++提供了C連接交換指定符號extern"C"來解決名字匹配問題。
14、如何讓局部變量具有全局生命期。
正確答案:
具體的生命期的概念我覺得我還要好好深入的學(xué)習(xí)一下,但是這個題目還算比較簡單,即用static修飾就可以了,但是只是生命期延長,范圍并沒有擴(kuò)大,除非把這個變量定義在函數(shù)體外的靜態(tài)區(qū),不過那樣就變成全局變量了,仿佛不符合題目要求。
15、解釋堆和棧的區(qū)別。
正確答案:
具體的生命期的概念我覺得我還要好好深入的學(xué)習(xí)一下,但是這個題目還算比較簡單,即用static修飾就可以了,但是只是生命期延長,范圍并沒有擴(kuò)大,除非把這個變量定義在函數(shù)體外的靜態(tài)區(qū),不過那樣就變成全局變量了,仿佛不符合題目要求。
16、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”聲明?
正確答案:
函數(shù)和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern “C”修飾的變量和函數(shù)是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調(diào)用C 函數(shù)。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
17、strtok函數(shù)在使用上要注意什么問題。
正確答案:
這個問題我不知道能不能回答全面,因?yàn)閷?shí)在是用的很少。這個函數(shù)的作用是分割字符串,但是要分割的字符串不能是常量,這是要注意的。比如先定義一個字符串:char array[]=”part1,part2″;,strtok的原形是char *strtok(char *string, char *delim);,我們將”,”作為分隔符,先用pt=strtok(array,”,”);,得到的結(jié)果print出來就是”part1″,那后面的呢,要寫成pt=strtok(NULL,”,”);,注意,要用NULL,如果被分割的字符串會被分成N段,那從第二次開始就一直要用NULL。總結(jié)起來,需要注意的是:被分割的字符串和分隔符都要使用變量;除第一次使用指向字符串的指針外,之后的都要使用NULL;注意使用這個函數(shù)的時候千萬別把指針跟丟了,不然就全亂了。
18、用預(yù)處理指令#define聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)
正確答案:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在這想看到幾件事情:
1). #define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)
2). 懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價的。 3). 意識到這個表達(dá)式將使一個16位機(jī)的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。
4). 如果你在你的表達(dá)式中用到UL(表示無符號長整型),那么你有了一個好的起點(diǎn)。記住,第一印象很重要。
19、說一說C與C++的內(nèi)存分配方式?
正確答案:
1)從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運(yùn)行期間都存在,如全局變量,static變量。
2)在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
3)從堆上分配(動態(tài)內(nèi)存分配)程序在運(yùn)行的時候用malloc或new申請任意多少的內(nèi)存,程序員負(fù)責(zé)在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期自己決定,使用非常靈活。
20、你如何理解MVC。簡單舉例來說明其應(yīng)用。
正確答案:
MVC模式是observer 模式的一個特例,典型的有MFC里面的文檔視圖架構(gòu)。
四、【華為C++面試題】
1、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”聲明?
正確答案:
二者的編譯器不同
2、inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);輸出是多少?
正確答案:
相當(dāng)于i=j=4;i=k=8;i=l=16;i=m=32;故最后i=32;
3、#include與#include“file.h”的區(qū)別?
正確答案:
相當(dāng)于i=j=4;i=k=8;i=l=16;i=m=32;故最后i=32;
4、既然C++中有更好的const為什么還要使用宏?
正確答案:
相當(dāng)于i=j=4;i=k=8;i=l=16;i=m=32;故最后i=32;
5、重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區(qū)別?
正確答案:
從定義上來說:重載:是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。重寫:是指子類重新定義復(fù)類虛函數(shù)的方法。從實(shí)現(xiàn)原理上來說:重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)。重寫:當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。
6、C++和C定義結(jié)構(gòu)的分別是什么。
正確答案:
Clanguage的結(jié)構(gòu)僅僅是數(shù)據(jù)的結(jié)合Cplusplus的struct和class其實(shí)具備幾乎一樣的功能,只是默認(rèn)的訪問屬性不一樣而已。
7、#include和#include"a.h"有什么區(qū)別?
正確答案:
對于#include,編譯器從標(biāo)準(zhǔn)庫路徑開始搜索a.h對于#include"a.h",編譯器從用戶的工作路徑開始搜索a.h
8、#include和#include“filename.h”有什么區(qū)別?
正確答案:
前者用來包含開發(fā)環(huán)境提供的庫頭文件,后者用來包含自己編寫的頭文件。
9、C函數(shù)可否單獨(dú)編譯?
正確答案:
外部函數(shù),可以在開始引進(jìn)來
10、請簡述以下兩個for循環(huán)的優(yōu)缺點(diǎn)
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)點(diǎn):程序簡潔。缺點(diǎn):多執(zhí)行了n-1次邏輯判斷,并且打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。
2)優(yōu)點(diǎn):循環(huán)的效率高。缺點(diǎn):程序不簡潔。
11、完成程序,實(shí)現(xiàn)對數(shù)組的降序排序
#include
voidsort(intarray[]);
intmain()
{
intarray[]={45,56,76,234,1,34,23,2,3};//數(shù)字任//意給出
sort(array);
return0;
}
voidsort(intarray[])
{____________________________________
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;
}
}
—————————————————–
}
12、delete[]arry和deletearry一樣嗎?不一樣請說明;
正確答案:
delete[]arry釋放的是多個同一類型的地址空間Delete[]arry釋放的是一個某種類型的地址空間
13、結(jié)合1個你認(rèn)為比較能體現(xiàn)OOP思想的項(xiàng)目,用UML來描述。
正確答案:
(最好這個項(xiàng)目繼承,多態(tài),虛函數(shù)都有體現(xiàn))這個問題大概會占面試時間的一半,并且會問很多問題,一不小心可能會被問住)
14、C與C++各自是如何定義常量的?有什么不同?
正確答案:
C中是使用宏#define定義,C++使用更好的const來定義。區(qū)別:1)const是有數(shù)據(jù)類型的常量,而宏常量沒有,編譯器可以對前者進(jìn)行靜態(tài)類型安全檢查,對后者僅是字符替換,沒有類型安全檢查,而且在字符替換時可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。2)有些編譯器可以對const常量進(jìn)行調(diào)試,不能對宏調(diào)試。
15、頭文件中的ifndef/define/endif干什么用?
正確答案:
防止重復(fù)定義
16、C++中為什么用模板類。
正確答案:
(1)可用來創(chuàng)建動態(tài)增長和減小的數(shù)據(jù)結(jié)構(gòu)
(2)它是類型無關(guān)的,因此具有很高的可復(fù)用性。
(3)它在編譯時而不是運(yùn)行時檢查數(shù)據(jù)類型,保證了類型安全
(4)它是平臺無關(guān)的,可移植性
(5)可用于基本數(shù)據(jù)類型
17、動態(tài)連接庫的兩種方式?
正確答案:
調(diào)用一個DLL中的函數(shù)有兩種方法:1載入時動態(tài)鏈接(load-timedynamiclinking),模塊非常明確調(diào)用某個導(dǎo)出函數(shù),使得他們就像本地函數(shù)一樣。這需要鏈接時鏈接那些函數(shù)所在DLL的導(dǎo)入庫,導(dǎo)入庫向系統(tǒng)提供了載入DLL時所需的信息及DLL函數(shù)定位。2運(yùn)行時動態(tài)鏈接(run-timedynamiclinking),運(yùn)行時可以通過LoadLibrary或LoadLibraryEx函數(shù)載入DLL。DLL載入后,模塊可以通過調(diào)用GetProcAddress獲取DLL函數(shù)的出口地址,然后就可以通過返回的函數(shù)指針調(diào)用DLL函數(shù)了。如此即可避免導(dǎo)入庫文件了。
18、在什么時候需要使用“常引用”?
正確答案:
如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。常引用聲明方式:const類型標(biāo)識符&引用名=目標(biāo)變量名;
19、預(yù)處理器標(biāo)識#error的目的是什么?
正確答案:
如果你不知道答案,請看參考文獻(xiàn)1。這問題對區(qū)分一個正常的伙計(jì)和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在找一個書呆子,那么應(yīng)試者最好希望自己不要知道答案。
20、GCC3.2.2版本中支持哪幾種編程語言。
正確答案:
這個問題實(shí)在變態(tài),就像問你#error的作用是什么一樣。不可否認(rèn),gcc是linux下一個亮點(diǎn),是一個備受無數(shù)程序員推崇的編譯器,其優(yōu)點(diǎn)省略1000字,有興趣可以自己查,我翻了翻書,書上曰:支持C,C++,Java,Obj-C,Ada,Fortran,Pascal,Modula-3等語言,這個“等”比較要命,不過我認(rèn)為已經(jīng)很全了,如果認(rèn)為還是不全,干脆把ASM也加上算了,不過那已經(jīng)不算是編譯了。
五、【小米C++面試題】
1、已知strcpy的函數(shù)原型:charstrcpy(charstrDest,constchar*strSrc)其中strDest是目的字符串,strSrc是源字符串。不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù)strcpy。
正確答案:
charstrcpy(charstrDest,constcharstrSrc)
{
if(strDestNULL||strSrcNULL)
returnNULL;
if(strDest==strSrc)
returnstrDest;
chartempptr=strDest;
while((*strDest++=*strSrc++)!=‘\0’)
;
returntempptr;
}
2.請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
charGetMemory(void)
{
charp[]=“helloworld”;
returnp;
}
voidTest(void)
{
charstr=NULL;
str=GetMemory();
printf(str);
}
正確答案:亂碼
3、重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區(qū)別?
正確答案:
從定義上來說:重載:是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。重寫:是指子類重新定義復(fù)類虛函數(shù)的方法。從實(shí)現(xiàn)原理上來說:重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)。重寫:當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。
4、多重繼承如何消除向上繼承的二義性。
正確答案:
使用虛擬繼承即可.
5、#include與#include“file.h”的區(qū)別?
正確答案:
前者是從StandardLibrary的路徑尋找和引用file.h,而后者是從當(dāng)前工作路徑搜尋并引用file.h。
6、對數(shù)據(jù)庫的一張表進(jìn)行操作,同時要對另一張表進(jìn)行操作,如何實(shí)現(xiàn)?
正確答案:
將操作多個表的操作放入到事務(wù)中進(jìn)行處理
7、#include<filename.h>和#include“filename.h”有什么區(qū)別?
正確答案:
查找范圍不同,后者先查找工作路徑,再查找VC標(biāo)準(zhǔn)路徑;前者只查工作路徑。
8、預(yù)處理器標(biāo)識#error的目的是什么?
正確答案:
如果你不知道答案,請看參考文獻(xiàn)1。這問題對區(qū)分一個正常的伙計(jì)和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在找一個書呆子,那么應(yīng)試者最好希望自己不要知道答案。
9、頭文件的作用是什么?
正確答案:
1)通過頭文件來調(diào)用庫功能。
2)頭文件能加強(qiáng)類型安全檢查。
10、請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
voidGetMemory(charp)
{
p=(char)malloc(100);
}
voidTest(void)
{
char*str=NULL;
GetMemory(str);
strcpy(str,“helloworld”);
printf(str);
}
正確答案:
程序崩潰了
11、delete[]arry和deletearry一樣嗎?不一樣請說明;
正確答案:
delete[]arry釋放的是多個同一類型的地址空間Delete[]arry釋放的是一個某種類型的地址空間
12、請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
VoidGetMemory(char**p,intnum){
p=(char)malloc(num);
}
voidTest(void){
char*str=NULL;
GetMemory(&str,100);
strcpy(str,“hello”);
printf(str);
}
正確答案:
輸出“hello”
13、請簡述以下兩個for循環(huán)的優(yōu)缺點(diǎn)
//第一個
for(i=0;i<N;i++)
{
if(condition)
DoSomething();
else
DoOtherthing();
}
//第二個
if(condition)
{
for(i=0;i<N;i++)
DoSomething();
}
else
{
for(i=0;i<N;i++)
DoOtherthing();
}
正確答案:
先循環(huán)再判斷,先判斷再循環(huán)第一個優(yōu)點(diǎn):每個循環(huán)都先判斷,再執(zhí)行第二個優(yōu)點(diǎn):條件判斷,只發(fā)生其中一個行為
14、構(gòu)造函數(shù)可否是虛汗數(shù),為什么?析構(gòu)函數(shù)呢,可否是純虛的呢?
正確答案:
錯題解析:構(gòu)造函數(shù)不能為虛函數(shù),要構(gòu)造一個對象,必須清楚地知道要構(gòu)造什么,否則無法構(gòu)造一個對象。析構(gòu)函數(shù)可以為純虛函數(shù)。
15、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern"C"?
正確答案:
C++語言支持函數(shù)重載,C語言不支持函數(shù)重載。函數(shù)被C++編譯后在庫中的名字與C語言的不同。假設(shè)某個函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C編譯器編譯后在庫中的名字為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字。C++提供了C連接交換指定符號extern"C"來解決名字匹配問題。
16、請寫出下面代碼在32位平臺上的運(yùn)行結(jié)果,并說明sizeof的性質(zhì):
#include
#include
intmain(void)
{
chara[30];
charb=(char)malloc(20sizeof(char));
printf(“%d\n”,sizeof(a));
printf(“%d\n”,sizeof(b));
printf(“%d\n”,sizeof(a[3]));
printf(“%d\n”,sizeof(b+3));
printf(“%d\n”,sizeof((b+4)));
return0;
}
正確答案:
在32位系統(tǒng)下(如WIN32),指針長度為32位。a是一個有30個元素的字符型數(shù)組;b是一個字符串指針;a[3]是字符型;b+3是指針;*(b+4)是字符型。因此輸出:30、4、1、4、1
17、高級通信包括信號量,——-,——–
正確答案:
通常把信號、信號量通信稱為低級通信,而把管道、消息隊(duì)列、共享存儲區(qū)通信稱為高級通信,這個題目我也不知道怎么填了,。。。。。。
18、關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?
正確答案:
涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個類的一般性聯(lián)系,比如“學(xué)生”和“老師”就是一種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是一種相對松散的關(guān)系,聚合類不需要對被聚合類負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:從實(shí)現(xiàn)的角度講,聚合可以表示為:classA{…}classB{A*a;……}而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類與被組合類有相同的生命周期,組合類要對被組合類負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)系:實(shí)現(xiàn)的形式是:classA{…}classB{Aa;…}
19、盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?
正確答案:
這里,我期望應(yīng)試者能提到內(nèi)存碎片,碎片收集的問題,變量的持行時間等等。這個主題已經(jīng)在ESP雜志中被廣泛地討論過了(主要是選項(xiàng):J.Plauger,他的解釋遠(yuǎn)遠(yuǎn)超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應(yīng)試者進(jìn)入一種虛假的安全感覺后,我拿出這么一個小節(jié)目:下面的代碼片段的輸出是什么,為什么?
charptr;
if((ptr=(char)malloc(0))==NULL)
puts(“Gotanullpointer”);
else
puts(“Gotavalidpointer”);
這是一個有趣的問題。最近在我的一個同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個合法的指針之后,我才想到這個問題。這就是上面的代碼,該代碼的輸出是“Gotavalidpointer”。
20、請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
voidTest(void){
charstr=(char)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!=NULL){
strcpy(str,“world”);
printf(str);
}
}
正確答案:
錯題解析:輸出“world”
總結(jié)
以上是生活随笔為你收集整理的C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity用UnityWebReques
- 下一篇: 计算机职业资格证书有哪些