文思海輝 2021 技術(shù)崗面試題

小編:管理員 1656閱讀 2021.10.10

第1題:

在C++程序中調用被C編譯器編譯后的函數,為什么要加extern “C”?



?函數經(jīng)過(guò)編譯系統的翻譯成匯編,函數名對應著(zhù)匯編標號。?

?因為C編譯函數名與得到的匯編代號基本一樣,如:fun()=>_fun, main=>_main?

?但是C++中函數名與得到的匯編代號有比較大的差別。?

?如:由于函數重載,函數名一樣,但匯編代號絕對不能一樣。?

?為了區分,編譯器會(huì )把函數名和參數類(lèi)型合在一起作為匯編代號,?

?這樣就解決了重載問(wèn)題。具體如何把函數名和參數類(lèi)型合在一起,?

?要看編譯器的幫助說(shuō)明了。?

?這樣一來(lái),如果C++調用C,如fun(),則調用名就不是C的翻譯結果_fun,?

?而是帶有參數信息的一個(gè)名字,因此就不能調用到fun(),為了解決?

?這個(gè)問(wèn)題,加上extern "C"表示該函數的調用規則是C的規則,則調用?

?時(shí)就不使用C++規則的帶有參數信息的名字,而是_fun,從而達到調用?

?C??函數的目的。?



第2題:

關(guān)聯(lián)、聚合以及組合的區別?



關(guān)聯(lián):指的是模型元素之間的一種語(yǔ)義聯(lián)系,是類(lèi)之間的一種很弱的聯(lián)系。關(guān)聯(lián)可以有方向,可以是單向關(guān)聯(lián),也可以是雙向關(guān)聯(lián)??梢越o關(guān)聯(lián)加上關(guān)聯(lián)名來(lái)描述關(guān)聯(lián)的作用。關(guān)聯(lián)兩端的類(lèi)也可以以某種角色參與關(guān)聯(lián),角色可以具有多重性,表示可以有多少個(gè)對象參與關(guān)聯(lián)??梢酝ㄟ^(guò)關(guān)聯(lián)類(lèi)進(jìn)一步描述關(guān)聯(lián)的屬性、操作以及其他信息。關(guān)聯(lián)類(lèi)通過(guò)一條虛線(xiàn)與關(guān)聯(lián)連接。對于關(guān)聯(lián)可以加上一些約束,以加強關(guān)聯(lián)的含義。
??關(guān)聯(lián)在C++中呈現為:?

?class A{...}?
???class B{ ...}
?A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)?

?即一個(gè)類(lèi)作為另一個(gè)類(lèi)方法的參數。?

?聚合:指的是整體與部分的關(guān)系。通常在定義一個(gè)整體類(lèi)后,再去分析這個(gè)整體類(lèi)的組成結構。從而找出一些組成類(lèi),該整體類(lèi)和組成類(lèi)之間就形成了聚合關(guān)系。例如一個(gè)航母編隊包括??漳概?、驅護艦艇、艦載飛機及核動(dòng)力攻擊潛艇等。需求描述中“包含”、“組成”、“分為叢糠?”等詞常意味著(zhù)聚合關(guān)系。?

?組合:也表示類(lèi)之間整體和部分的關(guān)系,但是組合關(guān)系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關(guān)系。?

?聚合和組合的區別在于:聚合關(guān)系是“has-a”關(guān)系,組合關(guān)系是“contains-a”關(guān)系;聚合關(guān)系表示整體與部分的關(guān)系比較弱,而組合比較強;聚合關(guān)系中代表部分事物的對象與代表聚合事物的對象的生存期無(wú)關(guān),一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時(shí)也就刪除了代表部分事物的對象。?

?我們用淺顯的例子來(lái)說(shuō)明聚合和組合的區別?!皣萍彝觥?,國滅了,家自然也沒(méi)有了,“國”和“家”顯然也是組合關(guān)系。而相反的,計算機和它的外設之間就是聚合關(guān)系,因為它們之間的關(guān)系相對松散,計算機沒(méi)了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關(guān)系中,部分可以獨立于聚合而存在,部分的所有權也可以由幾個(gè)聚合來(lái)共享,比如打印機就可以在辦公室內被廣大同事共用。?

?在C++語(yǔ)言中,從實(shí)現的角度講,聚合可以表示為:?

?class A {...}?
???class B { A* a; .....}?

?即類(lèi)B包含類(lèi)A的指針;?

?而組合可表示為:?

?class A{...}?
???class B{ A a; ...}?

?即類(lèi)B包含類(lèi)A的對象。?

?關(guān)聯(lián)和聚合的區別主要在語(yǔ)義上,關(guān)聯(lián)的兩個(gè)對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的,例如一個(gè)公司包含了很多員工,其實(shí)現上是差不多的。聚合和組合的區別則在語(yǔ)義和實(shí)現上都有差別,組合的兩個(gè)對象之間其生命期有很大的關(guān)聯(lián),被組合的對象是在組合對象創(chuàng )建的同時(shí)或者創(chuàng )建之后創(chuàng )建,在組合對象銷(xiāo)毀之前銷(xiāo)毀。一般來(lái)說(shuō)被組合對象不能脫離組合對象獨立存在,而且也只能屬于一個(gè)組合對象,例如一個(gè)文檔的版本,必須依賴(lài)于文檔的存在,也只能屬于一個(gè)文檔。聚合則不一樣,被聚合的對象可以屬于多個(gè)聚合對象,例如一個(gè)員工可能可以屬于多個(gè)公司。?



第3題:

?面向對象的三個(gè)特征,并簡(jiǎn)述之。?



第4題:

?什么時(shí)候使用“常引用”?



?如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。?



第5題:

?static??有什么用途??



?①限制變量的作用域;?

?②設置變量的存儲域;?



第6題:

改錯題?

?Void GetMemory??(??char *buf,int size??)?

?{?

??????? if(buf != NULL ) free( buf );?

??????? buf = (char *) malloc ( size );?

?}?




?Int main(int argc, char *argv? )?

?{?

??????? char * buf;?

??????? GetMemory( buf , 10);?

??????? printf(“%s”,buf);?

??????? free(buf);?

??????? if(buf != NULL)?

?{?

??????? Printf(“%s”,buf);?

?}?

?return 1;?

?}?



第7題:

?已知string類(lèi)定義如下,寫(xiě)出類(lèi)的成員函數實(shí)現。?

?Class String?

?{?

?Public??:?

??????? String??(??const char *str = NULL??)??;?

??????? String ( const String &another );?

??????? ~String();?

??????? String & operater = (const String &rhs);?

?Private:?

??????? Char *m_data;?

?}?



第8題:

?寫(xiě)一個(gè)雙向鏈表的插入和刪除操作?



第9題:

?線(xiàn)性表a , b 為兩個(gè)有序升序的線(xiàn)性表,編寫(xiě)一程序,使兩個(gè)有序線(xiàn)性表合并成一個(gè)有序升序線(xiàn)性表h?


關(guān)聯(lián)標簽:
91久久香蕉国产线看观看软件|思思热在线视频精品996|精品无码一区二区三区水蜜桃|久久综合无码中文字幕无码|午夜亚洲AⅤ无码高潮片在线