c 之型別安全

2021-08-03 06:25:52 字數 1068 閱讀 8106

1、什麼是型別安全

型別安全簡單來說就是訪問可以被授權訪問的記憶體位置,型別安全的**不會試圖訪問自己未被授權的記憶體區域。一方面,型別安全被用來形容程式語言,主要根據這門程式語言是否提供型別安全的保障機制;另一方面,型別安全也可以用來形容程式,根據這個程式是否隱含型別錯誤。型別安全的語言和程式之前,其實沒有必然的聯絡。型別安全的語言,使用不當,也可能寫出來型別不安全的程式;型別不安全的語言,使用得當,也可以寫出非常安全的程式。

2、c的型別安全

c語言不是型別安全的語言,原因如下:

1)很多情況下,會存在型別隱式轉換,比如bool自動轉成int型別;

2)malloc函式返回的是void *的空型別指標,通常需要這樣的顯示型別轉換char* pstr=(char*)malloc(100*sizeof(char)),型別匹配沒有問題。但如果出現int* pint=(int*)malloc(100*sizeof(char))這樣的轉換,可能會帶來一些問題,但c並不會提示。

當然,在有些情況下表現還是型別安全的,當從乙個結構體指標轉換成另乙個結構體指標時,編譯器會報錯,除非顯式轉換。

3、c++的型別安全

c++也不是型別安全的語言,但遠比c更具型別安全。相比於c,提供了一些安全保障機制:

1)用操

作符new來申請記憶體,嚴格與物件型別匹配,而malloc是void *;

2)函式引數為void *的可以改寫成模板,模板支援執行時檢查引數型別;

3)使用const代替define來定義常量,具有型別、作用

域,而不是簡單的文字替換;

4)使用inline代替define來定義函式,結合函式的過載,在型別安全的前提下可以支援多種型別,如果改寫成模板,會更安全;

5)提供dynamic_cast使得轉換過程更安全。

儘管如此,但如果使用空型別指標或者在兩個不同型別指標間做強制轉換,很可能引發型別不安全的問題。

4、總結

想要保證程式的型別安全,盡量避免使用空型別指標,盡量不對不同型別的指標做強制轉換。

C 之型別轉換

一 static cast型別轉換 static cast 應用於c 可以隱式轉換的型別之間,包括雙向隱式轉換和單向隱式轉換。例如 雙向隱式轉換 int a char b a static cast b 可以直接通過隱式轉換,轉換型別 a b b static cast a 可以直接通過隱式轉換,轉...

c 之型別萃取

剛剛我們接觸過模板類,類似於這樣的 在這個類中,我們如何知道它是什麼型別的呢?這裡,我們可以在類中加入乙個內嵌型別,如 這樣就可以知道它是使用者自定義的還是本身型別就擁有的,我們用到了型別萃取的方式。我們把 ispodtype叫做內嵌型別。當我們遇到其他型別時,就將 ispodtype定義為 fal...

C 之型別轉換

實現將a類的物件轉換為b類物件的方法有3種 a類物件 方法一 如果a為基類,b為派生類,能夠將派生類的物件轉換基類的物件,如b b a a b 方法二 在a類物件中定義轉換建構函式 單形參建構函式 除掉預設形參 並將b類物件作為形參,同一時候禁止使用explicit關鍵子,形如 a b b,int ...