1.在C++程式中呼叫被C編譯器編譯後的函數,爲什麼要加extern"C"
答:extern是C/C++語言中表明函數和全域性變數的作用範圍的。其宣告的函數和變數可以在模組中或其他模組中使用。
C++語言支援函數過載,C語言不支援函數過載。函數被C++編譯後在庫中的名字與C語言的不同。
假設某個C 函數的宣告如下:
void foo(int x, int y);
該函數被C 編譯器編譯後在庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字用來支援函數過載和型別安全連線。由於編譯後的名字不同,C++程式不能直接呼叫C 函數。C++提供了一個C 連線交換指定符號extern「C」,去找_foo.
2.Makefile檔案的作用
答:makefile定義一系列規則來指定檔案哪些需要先編譯,哪些需要後編譯,哪些需要重新編譯。像shell指令碼一樣,可以執行操作系統的命令,最大的用處是「自動化編譯」,只需make命令,整個工程完全自動編譯。
3.閱讀Makefile檔案
all:libmys.so//終極目標(.so動態庫鏈接,.a靜態庫鏈接)式規則用於說明 何時及如何重新生成目標,其列出了目標依賴的檔案信 // 息,並通過呼叫命令來建立或更新目標
// targets : prerequisites
// recipe
// …
// targets爲要生成或更新的目標,prerequisites爲目標依賴的關係,recipe爲生成目標的命令,一個規則可以有多條 // recipe
SRC = f1.c f2.c f3.c//當前檔案下的所有.c檔案
TGT = $(SRC:.c=.o)//$:去變數值,將SRC所有.c=>.o=>TGT
%.o : %.c //%表示靜態模式下的自動化變數操作,「%」意思是匹配一個或者多個字元,例如,「%.h」表示所有以「.h」結尾的檔案模式規則提供的一種擴充套件make隱式規則的方法,規則與普通規則一樣,主要是目標必定含有%號,
cc -c $?//$? 規則中日期新於目標的所有相關檔案的列表
libmys.so : $(TGT)
cc -shared -o $@ $(TGT)//-shared 表示生成動態庫檔案,$@ 規則的目標所對應的檔名,-o鏈接
clean://執行make clean清理生成的目標檔案和動態庫
rm -f $(TGT)
(1)此Makefile檔案的主要功能是什麼?
答:生成共用檔案libmys.so
(2)此Makefile檔案包含多少個規則?它們分別是什麼?
答:4個規則(非命令),all,%.o:%.c,libmys.so,clean
(3)使用此Makefile檔案可以生成目標檔案f2.o嗎?爲什麼?
答:可以。因爲規則%.o,%.c,已經定義了*.o,*,c的關係與生成方法
4.簡述static關鍵字作用(重點)
(1)設定變數的儲存域:static變數的作用範圍爲該函數體,該變數記憶體只被分配一次,下次呼叫仍維持上值。
(2)限制區域性變數的作用域:只能在本原始檔中使用。,在模組內的static 變數可以在模組內函數所用,但不能被模組外其他函數存取。
(3)限制函數作用域:在模組內的static 函數可以在模組內函數所用,但不能被模組外其他函數存取。
(4)類中static成員變數:與所有範例共用。
(5)類中static成員函數:屬於整個類所擁有,這個函數接收this指針,f()括號內無this,因而只能存取類的static成員變數
5.過載(overload)和重寫(overied,鋪蓋)的區別
overload過載:是允許存在多個同名函數,而這些函數的參數表不同(個數,型別)
overied重寫:是指子類重新定義父類別虛擬函式的方法。
範圍區別:重寫和被重寫函數,在不同類中;過載和被過載函數在同一類中
參數區別:重寫和被重寫函數參數列表一定相同,過載和被過載參數列表一定不同。
virtual:重寫的基礎類別必須有virtual修飾,過載可有可無。
6.sizeof與strlen的區別
關鍵字:sizeof:返回一個物件或型別所佔位元組數
函數:strlen:檢測字串實際長度。
7.C語言分配記憶體的方式有哪些?C語言中常見記憶體錯誤有哪些?
(1)靜態儲存區分配
(2)棧上分配
(3)堆上分配
錯誤:1.記憶體未分配成功;2.參照了尚未初始化的指針;3.越界;4.忘記釋放記憶體;5.釋放記憶體繼續使用它
8.什麼是野指針?如何避免野指針?
野指針:指向不確定地址的指針變數,即沒有初始化;易出現段錯誤;
如何避免:a.指向空指針,b.使用malloc分配記憶體大小。
9.struct和class的區別
C:struct(數據型別:不能定義函數):預設public,不能修改,不可以繼承,不能直接初始成員。
C++:class:預設private,可以繼承,可以初始化,宣告類別範本。
10.什麼是函數的可重入性
可重入函數是指一個可以被多個任務呼叫的過程,任務呼叫的過程,任務在呼叫時可不必擔心數據是否會出錯。不可重入:靜態,malloc,I/O;
11.Makefile編寫中爲什麼把.c變成.o
答:爲了防止把所有.cpp檔案變成.o,從而編譯相應的.c檔案,可以提高編譯速度。
12.物件間是怎麼實現數據共用
答:1.使用區域性變數和全域性變數共用數據 2.通過類的數據成員共用數據 3.通過類的靜態成員 4.通過友元機制 機製 5.指針成員變數與計數
13.C++中SendMessage和PostMessage有什麼區別?
答:a.SendMessage是將指定資訊發送到某個視窗。這個指定的資訊呼叫視窗處理程式,直到視窗處理完這個程式才返回。
PostMessage 發送一個資訊到執行緒資訊佇列,不等執行緒處理,並立即返回。
14.關鍵字volatile有什麼含意?並給出三個不同的例子。
答:volatile是一個特徵修飾符(type specifiervolatile的作用是作爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。 例子1.並行裝置的硬體暫存器2.一箇中斷服務程式中修改的供其他程式檢測的變數。3.多執行緒應用中被幾個任務共用的變數。
15.簡述與new與malloc區別以及malloc實現原理,什麼情況下NEW分配不到空間。
答:
申請記憶體所在位置空間 | 返回型別的安全性 | 失敗結果不同 | 指定記憶體大小 | 呼叫 | |
new/delete | 自由儲存區 | 安全 | 拋出bac_alloc異常 | 根據型別設計 | 構造 |
malloc/free | 堆上 | 強轉 | NULL | 需顯式指出所需記憶體大小 | 不會 |
malloc原理:當操作收到程式申請時,就會遍歷鏈表,然後尋找第一個空間大於所申請空間的堆結點,然後將該結點從空間結點鏈表中刪除,將該結點空間分配給程式。
什麼情況:沒有可用的連續記憶體段大於你要分配的空間。
16.請講一講解構函式和虛構函數的用法和作用
答:解構:物件離開生存空間時執行,用來清理分配空間,釋放物件佔用資源。它的名字和類名相同,沒有返回值,沒有參數,不能隨意呼叫,也沒有過載,只是在類物件生命週期接輸時呼叫。
虛擬函式:用在繼承中,當派生類需要重新定義基礎類別的函數時需要基礎類別中將函數宣告爲虛擬函式,作爲使程式支援動態鏈接。
17.操作符過載的概念
答:通過過載可以擴充套件系統已有的功能,成員變數爲公有,且沒有定義構造,可以通過大括號來分割初始化成員。
操作符過載是C++的強大特性,本質通過函數擴充套件操作符,operator關鍵字是實現操作符的關鍵字,操作符遵循相同的函數過載原則。
18.C++裏面是不是所有的動作都是main()引起的?
答:不是,首先初始化全域性變數,當變數是一個物件,則會首先呼叫該物件的建構函式。
class A();
A a;
int main(){}
19.C++中函數模板與類別範本有什麼區別?
答:a.類別範本沒有自動型別推導
b.類別範本在模板參數中可以有預設參數。
c.函數模板是一種抽象的函數定義,它代表一類同構函數,類別範本是一種更高層的抽象的類定義