總結(jié)嵌入式軟開常問C/C++問題-1
1、指針和引用的區(qū)別?
(1)指針是一個(gè)變量,存儲(chǔ)的是變量的地址,引用是變量的別名,內(nèi)部實(shí)現(xiàn)是只讀指針;
(2)指針可以為空,引用不能為空,定義時(shí)必須初始化;
(3)指針在初始化之后可以改變指向,引用在初始化之后不能改變;
(4)指針可以有多級,引用只有一級;
(5)當(dāng)把指針作為參數(shù)進(jìn)行傳遞時(shí),也是將實(shí)參的一個(gè)拷貝傳遞給形參,二者指向的地址相同,但不是同一個(gè)變量,在函數(shù)中改變該變量的指向不影響實(shí)參,而引用是可以的;
(6)指針是具體變量,需要占用存儲(chǔ)空間,引用的本質(zhì)是一個(gè)指針,會(huì)占據(jù)4個(gè)字節(jié)的內(nèi)存;
2、堆和棧的區(qū)別
(1)堆和棧在空間分配方面的區(qū)別:
堆一般由程序員分配釋放,如果程序員不釋放,程序結(jié)束后可能有操作系統(tǒng)回收,分配方式類似于鏈表。棧一般由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值和局部變量的值等,操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
(2)堆和棧在緩存方式方面的區(qū)別:
堆存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定,所以調(diào)用這些對象的速度比較慢。棧使用一級緩存,通常是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢后立即釋放。
(3)堆和棧在數(shù)據(jù)結(jié)構(gòu)方面的區(qū)別:
堆一般被看做一棵樹,比如堆排序。棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
3、關(guān)鍵字static的作用是什么?
在C語言中static用來修飾局部靜態(tài)變量和外部靜態(tài)變量和函數(shù),而C++語言還可以用來定義類的成員變量和函數(shù),即靜態(tài)成員和靜態(tài)成員函數(shù),C++的靜態(tài)成員可以在多個(gè)對象實(shí)例之間進(jìn)行通信,傳遞信息。
(1)定義全局靜態(tài)變量和局部靜態(tài)變量:在變量前面加上static關(guān)鍵字。初始化的靜態(tài)變量會(huì)在.data段分配內(nèi)存,未初始化的靜態(tài)變量會(huì)在.bss段分配內(nèi)存。直到程序結(jié)束,靜態(tài)變量始終會(huì)維持前值。只不過全局靜態(tài)變量和局部靜態(tài)變量的作用域不一樣;
(2)定義靜態(tài)函數(shù):在函數(shù)返回類型前加上static關(guān)鍵字,函數(shù)被定義為靜態(tài)函數(shù)。靜態(tài)函數(shù)只能在本源文件中使用;
(3)在變量類型前加上static關(guān)鍵字,變量即被定義為靜態(tài)變量。靜態(tài)變量只能在本源文件中使用,比如:
static int a;
static void func();
(4)在C++中,static關(guān)鍵字可以用于定義類中的靜態(tài)成員變量:使用靜態(tài)數(shù)據(jù)成員,它既可以被當(dāng)成全局變量那樣去存儲(chǔ),但又被隱藏在類的內(nèi)部。類中的static靜態(tài)數(shù)據(jù)成員擁有一塊單獨(dú)的存儲(chǔ)區(qū),而不管創(chuàng)建了多少個(gè)該類的對象。所有這些對象的靜態(tài)數(shù)據(jù)成員都共享這一塊靜態(tài)存儲(chǔ)空間。
(5)在C++中,static關(guān)鍵字可以用于定義類中的靜態(tài)成員函數(shù):與靜態(tài)成員變量類似,類里面同樣可以定義靜態(tài)成員函數(shù)。只需要在函數(shù)前加上關(guān)鍵字static就可以。如靜態(tài)成員函數(shù)也是類的一部分,而不是對象的一部分。所有這些對象的靜態(tài)數(shù)據(jù)成員都共享這一塊靜態(tài)存儲(chǔ)空間。
附加:
面向?qū)ο蟮膕tatic關(guān)鍵字
靜態(tài)數(shù)據(jù)成員有以下特點(diǎn):
(1)靜態(tài)數(shù)據(jù)成員要在類外定義,此時(shí)不能再帶上static的關(guān)鍵字。
(2)靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣遵從public,protected,private訪問規(guī)則;
(3)private,protected 的static成員雖然可以在類外初始化,但是不能在類外被訪問。
(4)靜態(tài)成員為所有類對象所共享
(5)類的靜態(tài)數(shù)據(jù)成員有兩種訪問形式:
<類對象名>.<靜態(tài)數(shù)據(jù)成員名> 或 <類類型名>::<靜態(tài)數(shù)據(jù)成員名>
如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限為public時(shí),可在程序中按上述格式來引用靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù),關(guān)于靜態(tài)成員函數(shù),可以總結(jié)為以下幾點(diǎn):
出現(xiàn)在類體外的函數(shù)定義不能指定關(guān)鍵字static;
(1) 靜態(tài)成員之間可以相互訪問,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù);
(2) 非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;
(3) 靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員;
(4) 由于沒有this指針的額外開銷,因此靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會(huì)有少許的增長;
(5) 調(diào)用靜態(tài)成員函數(shù),可以用成員訪問操作符(.)和(->)為一個(gè)類的對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù),也可以直接使用如下格式:
<類名>::<靜態(tài)成員函數(shù)名>(參數(shù))調(diào)用類的靜態(tài)成員函數(shù)
4、線程和進(jìn)程的聯(lián)系和區(qū)別?
(1)進(jìn)程包含線程,一個(gè)進(jìn)程里可以有一個(gè)或多個(gè)線程;
(2)進(jìn)程和線程都是為了處理并發(fā)編程這樣的場景,但是進(jìn)程創(chuàng)建和釋放的時(shí)候效率低,相比之下,線程更輕量,創(chuàng)建和釋放效率更好;
(3)操作系統(tǒng)創(chuàng)建進(jìn)程是給進(jìn)程分配資源,進(jìn)程是操作分配資源的基本單位,操作系統(tǒng)創(chuàng)建的線程是在CPU上調(diào)度執(zhí)行,線程是操作系統(tǒng)調(diào)度執(zhí)行的基本單位;
(4)進(jìn)程具有獨(dú)立性,每個(gè)進(jìn)程有各自的虛擬地址空間,一個(gè)進(jìn)程掛了不會(huì)影響其他進(jìn)程,同一個(gè)進(jìn)程的多個(gè)線程共用同一個(gè)內(nèi)存空間,一個(gè)線程掛了很可能會(huì)影響其他的線程,甚至導(dǎo)致整個(gè)進(jìn)程崩潰。
5、C和C++的區(qū)別是什么?
C是結(jié)構(gòu)化語言,其重點(diǎn)是算法和數(shù)據(jù)結(jié)構(gòu),C++在C的基礎(chǔ)上增加類。C程序考慮的是如何通過一個(gè)過程,對輸入進(jìn)行運(yùn)算處理得到輸出,而對于C++而言,首先考慮的是如何構(gòu)造一個(gè)對象模型,使得該模型與之對應(yīng)的問題域契合,就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程控制。
6、const的用途是什么?
const用來定義只讀變量,也就是常量。
const修飾函數(shù)的參數(shù)和函數(shù)的返回值。
const修飾函數(shù)的定義體,這里的函數(shù)是類的成員函數(shù),被const修飾的成員函數(shù)代表不修改成員變量的值。
7、數(shù)組和鏈表有什么區(qū)別?
(1)在存儲(chǔ)形式方面,數(shù)組是一塊連續(xù)的空間,聲明時(shí)就要確定長度;鏈表是一塊可以不連續(xù)的動(dòng)態(tài)空間,長度可以改變,每個(gè)結(jié)點(diǎn)都要保存相鄰結(jié)點(diǎn)的指針。
(2)在數(shù)據(jù)查找方面,數(shù)組的線性查找速度快,查找操作直接使用偏移地址;鏈表需要按照順序檢索結(jié)點(diǎn),效率較低。
(3)在數(shù)據(jù)的插入或刪除方面,鏈表可以快速插入和刪除結(jié)點(diǎn),但數(shù)組需要大量的數(shù)據(jù)移動(dòng)。
(4)在越界問題方面,鏈表不存在越界問題,數(shù)組存在越界問題。
(5)數(shù)組的優(yōu)點(diǎn):隨機(jī)訪問性強(qiáng),查找速度快;數(shù)組的缺點(diǎn):插入和刪除效率低,可能浪費(fèi)內(nèi)存,內(nèi)存空間要求高,必須有足夠的連續(xù)空間,數(shù)組大小固定,不能動(dòng)態(tài)拓展。鏈表的優(yōu)點(diǎn):插入刪除速度快,內(nèi)存利用率高,不會(huì)浪費(fèi)內(nèi)存,大小沒有固定,拓展很靈活;鏈表的缺點(diǎn):不能隨機(jī)查找,必須從第一個(gè)開始遍歷,查找效率低。
8、面向?qū)ο笥惺裁刺卣鳎?/strong>
面向?qū)ο缶哂蟹庋b性、繼承和多態(tài)三大特征:
(1)封裝性:將客觀事物抽象成類,每個(gè)類對自身的數(shù)據(jù)和方法實(shí)行protection(private, protected, public)。
(2)繼承性:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。
(3)多態(tài)性:是將父類對象設(shè)置成為和一個(gè)或更多它的子對象相等的技術(shù)。用子類對象給父類對象賦值之后,父類對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。
9、在C++中,重載和重寫的區(qū)別是什么?
重載指的是同一個(gè)訪問區(qū)被聲明的幾個(gè)具有不同參數(shù)列(參數(shù)的類型,個(gè)數(shù),順序不同)的同名函數(shù),根據(jù)參數(shù)列表確定調(diào)用哪個(gè)函數(shù),重載不關(guān)心函數(shù)的返回類型。
重寫指的是派生類中存在重新定義的函數(shù),它的函數(shù)名,參數(shù)列表,返回值類型,所有都必須和基類中被重寫的參數(shù)一致。只有函數(shù)體不同,派生類調(diào)用時(shí)會(huì)調(diào)用派生類的重寫函數(shù),不會(huì)調(diào)用被重寫函數(shù)。重寫的基類中被重寫的掛不是關(guān)于不需要有virtual修飾。
10、解釋一下封裝、繼承和多態(tài)?
封裝是實(shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)的第一步,將數(shù)據(jù)或函數(shù)等集合在一個(gè)個(gè)的單元(類)中。封裝的意義就是保護(hù)或防止數(shù)據(jù)被無意破壞。
繼承主要用來實(shí)現(xiàn)重用代碼,節(jié)省開發(fā)時(shí)間,子類可以繼承父類。
多態(tài)是指同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過指向基類的指針來調(diào)用實(shí)現(xiàn)派生類中的方法。
11、常用的排序算法的優(yōu)缺點(diǎn)和特點(diǎn)是什么?
常用的排序算法有選擇、冒泡、快速、希爾、歸并、堆排等。
(1)選擇排序法的優(yōu)點(diǎn)是移動(dòng)數(shù)據(jù)的次數(shù)少,缺點(diǎn)是比較數(shù)據(jù)的次數(shù)多。
(2)冒泡排序法的優(yōu)點(diǎn)是數(shù)據(jù)穩(wěn)定,誤差小,缺點(diǎn)是速度慢。
(3)快速排序是冒泡排序的一種改進(jìn),其優(yōu)點(diǎn)是速度快,數(shù)據(jù)移動(dòng)少,缺點(diǎn)是穩(wěn)定性不足。
(4)希爾排序先將整個(gè)待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序,待整個(gè)序列中的記錄基本有序時(shí),再對全體記錄進(jìn)行依次直接插入排序。其優(yōu)點(diǎn)是速度快,數(shù)據(jù)移動(dòng)少,缺點(diǎn)是不穩(wěn)定。
(5)歸并算法是一種分治法排序,該算法比較穩(wěn)定,一般用于對總體無序但局部有序的數(shù)列。其優(yōu)點(diǎn)是效率較高,穩(wěn)定,缺點(diǎn)是比較占用內(nèi)存。
(6)堆排序在直接選擇排序的基礎(chǔ)上利用了比較結(jié)果。因此它的優(yōu)點(diǎn)是效率提高很大,缺點(diǎn)是對數(shù)據(jù)的有序性不敏感。
12、new和malloc的區(qū)別?
(1)new是C++中的操作符,malloc是C中的一個(gè)函數(shù)。
(2)new不止分配內(nèi)存,而且會(huì)調(diào)用類的構(gòu)造函數(shù),同理delete調(diào)用類的析構(gòu)函數(shù),而malloc只分配內(nèi)存,不會(huì)進(jìn)行初始化類成員的工作,同樣free也不會(huì)調(diào)用析構(gòu)函數(shù)。
(3)內(nèi)存泄露對于malloc或者new都可以檢查出來,區(qū)別在于new可以指明是文件的哪一行,而malloc沒有這些信息。
(4)new可以認(rèn)為是malloc加構(gòu)造函數(shù)的執(zhí)行,new出來的指針是直接帶類型信息的,而malloc返回的值都是void指針。
13、有沒有用過STL庫?常見的STL容器有哪些?算法用過哪幾個(gè)?
STL包括兩部分內(nèi)容:容器和算法。容器,即存放數(shù)據(jù)的地方。比如array等。在STL中,容器分為兩類:序列式容器和關(guān)聯(lián)式容器。
序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;關(guān)聯(lián)式容器,內(nèi)部結(jié)構(gòu)基本上是一顆平衡二叉樹。所謂關(guān)聯(lián),指每個(gè)元素都有一個(gè)鍵值和一個(gè)實(shí)值,元素按照一定的規(guī)則存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。
下面各選取一個(gè)作為說明:
vector:它是一個(gè)動(dòng)態(tài)分配存儲(chǔ)空間的容器。區(qū)別于C++中的array,array分配的空間是靜態(tài)的,分配之后不能被改變,而vector會(huì)自動(dòng)重分配(擴(kuò)展)空間。
set:其內(nèi)部元素會(huì)根據(jù)元素的鍵值自動(dòng)被排序。區(qū)別于map,它的鍵值就是實(shí)值,而map可以同時(shí)擁有不同的鍵值和實(shí)值。
算法,如排序,復(fù)制等以及容器特定的算法。
迭代器是STL的精髓,將其描述為:迭代器提供了一種方法,使它能夠
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
7年嵌入式軟、硬件開發(fā)經(jīng)驗(yàn),分享嵌入式軟件開發(fā)相關(guān)資料,簡歷、工作、技術(shù)支持?。?!