日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++是类型安全的吗?

發(fā)布時間:2025/6/15 c/c++ 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++是类型安全的吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C++類型安全

http://blog.csdn.net/btwsmile/article/details/6693178

什么是類型安全?

類型安全很大程度上可以等價于內(nèi)存安全,類型安全的代碼不會試圖訪問自己沒被授權(quán)的內(nèi)存區(qū)域。“類型安全”常被用來形容編程語言,其根據(jù)在于該門編程語言是否提供保障類型安全的機制;有的時候也用“類型安全”形容某個程序,判別的標(biāo)準(zhǔn)在于該程序是否隱含類型錯誤。類型安全的編程語言與類型安全的程序之間,沒有必然聯(lián)系。好的程序員可以使用類型不那么安全的語言寫出類型相當(dāng)安全的程序,相反的,差一點兒的程序員可能使用類型相當(dāng)安全的語言寫出類型不太安全的程序。絕對類型安全的編程語言暫時還沒有。

C語言的類型安全

C只在局部上下文中表現(xiàn)出類型安全,比如試圖從一種結(jié)構(gòu)體的指針轉(zhuǎn)換成另一種結(jié)構(gòu)體的指針時,編譯器將會報告錯誤,除非使用顯式類型轉(zhuǎn)換。然而,C中相當(dāng)多的操作是不安全的。以下是兩個十分常見的例子:

(1)printf格式輸出

/*?-?print.cpp?*?version:1.1?*/?? int?main()?? {??printf("%d\n",10);??system("pause");??return?0;?? }??

上面的代碼很簡單,printf函數(shù)中,%d與10匹配,結(jié)果正確。

稍作修改:

/*?-?print.cpp?*?version:1.2?*/?? int?main()?? {??printf("%f\n",10);??system("pause");??return?0;?? }??

%f浮點數(shù)與10并不匹配,但是編譯通過,執(zhí)行也沒報錯,但是結(jié)果卻是:

0.000000
請按任意鍵繼續(xù). . .
更進一步,把%f修改為%s,編譯通過,執(zhí)行將報錯Access Violation。

(2)malloc函數(shù)的返回值

malloc是C中進行內(nèi)存分配的函數(shù),它的返回類型是void*即空類型指針,常常有這樣的用法char* pStr=(char*)malloc(100*sizeof(char)),這里明顯做了顯式的類型轉(zhuǎn)換。類型匹配尚且沒有問題,但是一旦出現(xiàn)int* pInt=(int*)malloc(100*sizeof(char))就很可能帶來一些問題,而這樣的轉(zhuǎn)換C并不會提示錯誤。

C++的類型安全

如果C++使用得當(dāng),它將遠(yuǎn)比C更有類型安全性。相比于C,C++提供了一些新的機制保障類型安全:

(1)操作符new返回的指針類型嚴(yán)格與對象匹配,而不是void*;

(2)C中很多以void*為參數(shù)的函數(shù)可以改寫為C++模板函數(shù),而模板是支持類型檢查的;

(3)引入const關(guān)鍵字代替#define constants,它是有類型、有作用域的,而#define constants只是簡單的文本替換;

(4)一些#define宏可被改寫為inline函數(shù),結(jié)合函數(shù)的重載,可在類型安全的前提下支持多種類型,當(dāng)然改寫為模板也能保證類型安全;

(5)C++提供了dynamic_cast關(guān)鍵字,使得轉(zhuǎn)換過程更加安全,因為dynamic_cast比static_cast涉及更多具體的類型檢查。

即便如此,C++也不是絕對類型安全的編程語言。如果使用不得當(dāng),同樣無法保證類型安全。比如下面兩個例子:

int?i=5;?? void*?pInt=&i;?? double?d=(*(double*)pInt);?? cout<<d<<endl;??

輸入結(jié)果不是5,而意想不到的結(jié)果:-9.25596e+061。又比如:

#include<iostream>?? using?namespace?std;??class?Parent?? {?? };?? class?Child1:public?Parent?? {?? public:??int?i;??Child1(int?e):i(e)??{??}?? };?? class?Child2:public?Parent?? {?? public:??double?d;??Child2(double?e):d(e)??{??}?? };?? int?main()?? {??Child1?c1(5);??Child2?c2(4.1);??Parent*?pp;??Child1*?pc1;??pp=&c1;??pc1=(Child1*)pp;??//#1?強制轉(zhuǎn)換,由于類型仍然為Child1*,不造成錯誤??cout<<pc1->i<<endl;??pp=&c2;??pc1=(Child1*)pp;??//#2?強制轉(zhuǎn)換,且類型發(fā)生變化,將造成錯誤??cout<<pc1->i<<endl;??system("pause");??return?0;?? }?

?

結(jié)果如下:

5
1717986918
請按任意鍵繼續(xù). . .

上面兩個例子之所以引起類型不安全的問題,是因為程序員使用不得當(dāng)。第一個例子用到了空類型指針void*,第二個例子則是在兩個類型指針之間進行強制轉(zhuǎn)換。因此,想保證程序的類型安全性,應(yīng)盡量避免使用空類型指針void*,盡量不對兩種類型指針做強制轉(zhuǎn)換。

總結(jié)

以上是生活随笔為你收集整理的C++是类型安全的吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。