1.請簡要說明C和C++的區別
C語言是程式導向的程式語言,重點在於演演算法和資料結構,以及怎樣解決問題。
C++是物件導向程式設計,考慮的是構造一個什麼樣的物件來解決問題,所以C與C++的最大區別在於它們解決問題的思想方法不一樣。此外C++幾乎完全相容C語言;支援泛型程式設計、例外處理等。
2.必須在建構函式初始化式裡進行初始化的資料成員有哪些,為什麼?
(1)const常數成員,因為常數只能初始化賦值,之後不能改變,所以必須放在初始化列表中;
(2)參照型別,參照必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表中;
(3)沒有預設建構函式的類所建立的成員,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是呼叫拷貝構造。
3.指標與參照的區別
(1) 指標是一個實體,而參照僅是一個別名;
(2) 參照直接當做變數使用,指標需要解除參照;
(3) 參照只能在定義時被初始化,之後不可改變;指標可變;
(4) 參照不能為空,指標可以為空;
(5) 「sizeof 參照」得到的是所指向變數的大小,而「sizeof 指標」得到的是指標本身(變數地址)的大小;
(6)程式為指標變數分配記憶體區域,而參照不需要分配記憶體區域。
4.全域性變數和區域性變數有什麼區別?記憶體是如何分配的?作業系統和編譯器是如何區分的?
區域性變數:定義在函數內
儲存在stack
函數呼叫開始到函數執行結束
只能在函數內使用
全域性變數:定義在函數外
data(初始化)或bss(未初始化)
main執行前定義完成,程式結束後釋放
程式的任何位置都可以使用
同名時,在函數內區域性變數會遮蔽全域性變數, 作業系統和編譯器通過它們的地址來分辨。
5.死鎖產生的原因是什麼?死鎖的四個必要條件是什麼?如何解除死鎖?
原因是多個程序或執行緒互相等待對方的資源,在得到新的資源之前不會釋放自己的資源,這樣就形成了死迴圈。
*資源互斥:*資源只有兩種狀態,只有可用和不可用兩狀態,不能同時使用,同一時刻只能被一個程序或執行緒使用。
*佔有且請求:*已經得到資源的程序或執行緒,繼續請求新的資源,並持續佔有舊的資源。
*資源不可剝奪:*資源已經分配程序或執行緒後,不能被其它程序或執行緒強制性獲取,除非資源的佔有者主動釋放。
*環路等待:*死鎖發生時,系統中必定有兩個或兩個以上的程序或執行緒組成一條等待環路。
可以重新啟動或者手動撤消程序,剝奪資源,打破鎖定