文思海輝 2021 技術(shù)崗面試題
小編:管理員 1656閱讀 2021.10.10
在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)推薦
- 烽火 2021 技術(shù)面試題 第1題:iso七層協(xié)議,以及每次有哪些協(xié)議。第2題:兩個(gè)ip地址為192.168.0.1/23和192.168.1.1/23 能不能互相通信。如果不能說(shuō)明為什么,應該怎么修改,才能互相通信 第3題:ATM,FPGA,TCP/IP,FIFO,FSM解釋 第4題:FPGA CPLD結構 第5題:FPGA開(kāi)發(fā)過(guò)程和工具 第6題…
- 經(jīng)典筆試題-JDBC及Hibernate篇 五、JDBC 及Hibernate:(共12 題:基礎10 道,中等難度2 道)110、數據庫,比如100 用戶(hù)同時(shí)來(lái)訪(fǎng),要采取什么技術(shù)解決?【基礎】 答:可采用連接池。111、什么是ORM?【基礎】 答:對象關(guān)系映射(Object—Relational Mapping,簡(jiǎn)稱(chēng)ORM)是一種為了解決面向對象…