文思海輝 2021 技術崗面試題
小編:管理員 1410閱讀 2021.10.10
在C++程序中調用被C編譯器編譯后的函數,為什么要加extern “C”?
?函數經過編譯系統的翻譯成匯編,函數名對應著匯編標號。?
?因為C編譯函數名與得到的匯編代號基本一樣,如:fun()=>_fun, main=>_main?
?但是C++中函數名與得到的匯編代號有比較大的差別。?
?如:由于函數重載,函數名一樣,但匯編代號絕對不能一樣。?
?為了區分,編譯器會把函數名和參數類型合在一起作為匯編代號,?
?這樣就解決了重載問題。具體如何把函數名和參數類型合在一起,?
?要看編譯器的幫助說明了。?
?這樣一來,如果C++調用C,如fun(),則調用名就不是C的翻譯結果_fun,?
?而是帶有參數信息的一個名字,因此就不能調用到fun(),為了解決?
?這個問題,加上extern "C"表示該函數的調用規則是C的規則,則調用?
?時就不使用C++規則的帶有參數信息的名字,而是_fun,從而達到調用?
?C??函數的目的。?
第2題:
關聯、聚合以及組合的區別?
關聯:指的是模型元素之間的一種語義聯系,是類之間的一種很弱的聯系。關聯可以有方向,可以是單向關聯,也可以是雙向關聯??梢越o關聯加上關聯名來描述關聯的作用。關聯兩端的類也可以以某種角色參與關聯,角色可以具有多重性,表示可以有多少個對象參與關聯??梢酝ㄟ^關聯類進一步描述關聯的屬性、操作以及其他信息。關聯類通過一條虛線與關聯連接。對于關聯可以加上一些約束,以加強關聯的含義。
??關聯在C++中呈現為:?
?class A{...}?
???class B{ ...}
?A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)?
?即一個類作為另一個類方法的參數。?
?聚合:指的是整體與部分的關系。通常在定義一個整體類后,再去分析這個整體類的組成結構。從而找出一些組成類,該整體類和組成類之間就形成了聚合關系。例如一個航母編隊包括??漳概?、驅護艦艇、艦載飛機及核動力攻擊潛艇等。需求描述中“包含”、“組成”、“分為叢糠?”等詞常意味著聚合關系。?
?組合:也表示類之間整體和部分的關系,但是組合關系中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關系。?
?聚合和組合的區別在于:聚合關系是“has-a”關系,組合關系是“contains-a”關系;聚合關系表示整體與部分的關系比較弱,而組合比較強;聚合關系中代表部分事物的對象與代表聚合事物的對象的生存期無關,一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。?
?我們用淺顯的例子來說明聚合和組合的區別?!皣萍彝觥?,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關系。而相反的,計算機和它的外設之間就是聚合關系,因為它們之間的關系相對松散,計算機沒了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關系中,部分可以獨立于聚合而存在,部分的所有權也可以由幾個聚合來共享,比如打印機就可以在辦公室內被廣大同事共用。?
?在C++語言中,從實現的角度講,聚合可以表示為:?
?class A {...}?
???class B { A* a; .....}?
?即類B包含類A的指針;?
?而組合可表示為:?
?class A{...}?
???class B{ A a; ...}?
?即類B包含類A的對象。?
?關聯和聚合的區別主要在語義上,關聯的兩個對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的,例如一個公司包含了很多員工,其實現上是差不多的。聚合和組合的區別則在語義和實現上都有差別,組合的兩個對象之間其生命期有很大的關聯,被組合的對象是在組合對象創建的同時或者創建之后創建,在組合對象銷毀之前銷毀。一般來說被組合對象不能脫離組合對象獨立存在,而且也只能屬于一個組合對象,例如一個文檔的版本,必須依賴于文檔的存在,也只能屬于一個文檔。聚合則不一樣,被聚合的對象可以屬于多個聚合對象,例如一個員工可能可以屬于多個公司。?
第3題:
?面向對象的三個特征,并簡述之。?
第4題:
?什么時候使用“常引用”?
?如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。?
第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類定義如下,寫出類的成員函數實現。?
?Class String?
?{?
?Public??:?
??????? String??(??const char *str = NULL??)??;?
??????? String ( const String &another );?
??????? ~String();?
??????? String & operater = (const String &rhs);?
?Private:?
??????? Char *m_data;?
?}?
第8題:
?寫一個雙向鏈表的插入和刪除操作?
第9題:
?線性表a , b 為兩個有序升序的線性表,編寫一程序,使兩個有序線性表合并成一個有序升序線性表h?
相關推薦
- 烽火 2021 技術面試題 第1題:iso七層協議,以及每次有哪些協議。第2題:兩個ip地址為192.168.0.1/23和192.168.1.1/23 能不能互相通信。如果不能說明為什么,應該怎么修改,才能互相通信 第3題:ATM,FPGA,TCP/IP,FIFO,FSM解釋 第4題:FPGA CPLD結構 第5題:FPGA開發過程和工具 第6題…
- 經典筆試題-JDBC及Hibernate篇 五、JDBC 及Hibernate:(共12 題:基礎10 道,中等難度2 道)110、數據庫,比如100 用戶同時來訪,要采取什么技術解決?【基礎】 答:可采用連接池。111、什么是ORM?【基礎】 答:對象關系映射(Object—Relational Mapping,簡稱ORM)是一種為了解決面向對象…