西安達內(nèi)培訓(http://www.xatarena.net)講師表示,在一個類中,C++用三個關(guān)鍵詞設置訪問界限:public, private和protected。它們決定了跟在他們后面的標識符的被使用情況:public意味著其后的標識符可以被用戶定義的其實例引用;而private則說明其后的標識符除了類的成員函數(shù)之外,用戶定義的其實例不能引用;protected為類的繼承提供了接口,同時保護其不被外界訪問。
事實上也,如果要想利用類的一個對象(或?qū)嵗﹣碓L問其成員時確實如此。但是,在C++中,由于容許將指針類型進行任意轉(zhuǎn)換,從而給用戶提供了一個"穿越保護屏障"的方法。這可以從以下的例程中看到:
#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的值變?yōu)?#039;'A'',但ch是常數(shù)!
*(iP+3)=100; //修改p.z的值
p.Show();
}
運行結(jié)果如下:
**********************************************
24
d=9.8759 x=1 y=2 ch=U z=0
d=9.32145 x=300 y=200 ch=A z=100
**********************************************
類CMyClass中有四個私有成員double d、int x,y與const char ch,通過其對象p肯定是不能察看或修改其值的,但是利用指向?qū)ο髉的指針ptr我們做到了。利用將ptr轉(zhuǎn)換成double* dP修改了d的值,然后再將dP轉(zhuǎn)化成int*iP修改了其余所有數(shù)據(jù)成員的值。 |
 |
|