国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++中類的數據成員的安全隱患

2019-11-17 05:43:53
字體:
來源:轉載
供稿:網友

    在任何一本關于"C++語言程序設計"的書中都有類似于如下的描述:
    在一個類中,C++用三個要害詞設置訪問界限:public, PRivate和protected。它們決定了跟在他們后面的標識符的被使用情況:public意味著其后的標識符可以被用戶定義的其實例引用;而private則說明其后的標識符除了類的成員函數之外,用戶定義的其實例不能引用;protected為類的繼續提供了接口,同時保護其不被外界訪問。
    事實上也,假如要想利用類的一個對象(或實例)來訪問其成員時確實如此。但是,在C++中,由于容許將指針類型進行任意轉換,從而給用戶提供了一個"穿越保護屏障"的方法。這可以從以下的例程中看到: #include class CMyClass{ double d; int x,y; const char ch;public: int z; CMyClass(int xx,int yy,char c):ch(c){x=xx,y=yy;d=9.8759;z=0;} void Show(){ cout<<"d="<<d<<" "<<"x="<<x<<" "<<"y="<<y<<" "<<"ch="<<ch<<" "; cout<<"z="<<z<<endl; }};void main(){ cout<<sizeof(CMyClass)<<endl; CMyClass p(1,2,''U''); p.Show(); CMyClass *ptr=&p;// ptr->x=9.32145; //錯誤,因為x是其私有成員,外部不能直接訪問。 double*dP=(double*)ptr; //獲取了p.d的地址 *dP=9.32145; //修改p.d的值 int*ip=(int*)(dP+1); //獲取了p.x的地址 *iP=300; //修改p.x的值 *(iP+1)=200; //修改p.y的值 *(iP+2)=65; //修改ch的值變為''A'',但ch是常數! *(iP+3)=100; //修改p.z的值 p.Show();}運行結果如下:**********************************************24d=9.8759 x=1 y=2 ch=U z=0d=9.32145 x=300 y=200 ch=A z=100**********************************************     類CMyClass中有四個私有成員double d、int x,y與const char ch,通過其對象p肯定是不能察看或修改其值的,但是利用指向對象p的指針ptr我們做到了。利用將ptr轉換成double* dP修改了d的值,然后再將dP轉化成int*iP修改了其余所有數據成員的值。從以上的結果還看出char在類中占有與int相同大小的內存,這是因為類的alignment(邊緣調整)引起的。一個更糟糕的事情是ch的值也被修改了!它可是一個const!!pointer is a god!它真是無所不能!!
指針的"不安全"性在此例中得到了充分的展示,應該對它進行限制!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庄河市| 浦县| 五台县| 凌源市| 灌云县| 南岸区| 宿州市| 桦南县| 澄城县| 山西省| 连江县| 东兰县| 梧州市| 恩平市| 咸丰县| 白银市| 商洛市| 保山市| 株洲市| 舞阳县| 常山县| 和硕县| 织金县| 永兴县| 深泽县| 名山县| 吴忠市| 岱山县| 长岭县| 金溪县| 株洲市| 云梦县| 台江县| 丹寨县| 陆河县| 张家口市| 兴城市| 黄梅县| 雅安市| 武宣县| 石首市|