c++訪(fǎng)問(wèn)私有private成員變量的常用方法
類(lèi)的對(duì)象不能直接訪(fǎng)問(wèn)類(lèi)聲明的私有成員變量,否則破壞了信息隱藏的目的。
在C++中,為了防止某些數(shù)據(jù)成員或成員函數(shù)從外部被直接訪(fǎng)問(wèn),可以將它們聲明為private,這樣編譯器會(huì)阻止任何來(lái)自外部非友元的直接訪(fǎng)問(wèn)。
私有成員變量的常用訪(fǎng)問(wèn)方法如下:
(1)通過(guò)公共函數(shù)為私有成員賦值
#include <iostream>
using namespace std;
class Test
{
private:
int x, y;
public:
void setX(int a)
{
x=a;
}
void setY(int b)
{
y=b;
}
void print(void)
{
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
}
} ;
int main()
{
Test p1;
p1.setX(1);
p1.setY(9);
p1.print( );
return 0;
}
(2)利用指針訪(fǎng)問(wèn)私有數(shù)據(jù)成員
#include <iostream>
using namespace std;
class Test
{
private:
int x,y;
public:
void setX(int a)
{
x=a;
}
void setY(int b)
{
y=b;
}
void getXY(int *px, int *py)
{
*px=x; //提取x,y值
*py=y;
}
};
int main()
{
Test p1;
p1.setX(1);
p1.setY(9);
int a,b;
p1.getXY(&a,&b); //將 a=x, b=y
cout<<a<<'\t'<<b<<endl;
return 0;
}
(3)利用函數(shù)訪(fǎng)問(wèn)私有數(shù)據(jù)成員
#include <iostream>
using namespace std;
class Test
{
private:
int x,y;
public:
void setX(int a)
{
x=a;
}
void setY(int b)
{
y=b;
}
int getX(void)
{
return x; //返回x值
}
int getY(void)
{
return y; //返回y值
}
};
int main()
{
Test p1;
p1.setX(1);
p1.setY(9);
int a,b;
a=p1.getX( );
b=p1.getY();
cout<<a<<'\t'<<b<<endl;
return 0;
}
(4)利用引用訪(fǎng)問(wèn)私有數(shù)據(jù)成員
#include <iostream>
using namespace std;
class Test
{
private:
int x,y;
public:
void setX(int a)
{
x=a;
}
void setY(int b)
{
y=b;
}
void getXY(int &px, int &py) //引用
{
px=x; //提取x,y值
py=y;
}
};
int main()
{
Test p1,p2;
p1.setX(1);
p1.setY(9);
int a,b;
p1.getXY(a, b); //將 a=x, b=y
cout<<a<<'\t'<<b<<endl;
return 0;
}
下面是其它網(wǎng)友的補(bǔ)充
訪(fǎng)問(wèn)C++類(lèi)對(duì)象中私有成員變量的方法
原則上,C++類(lèi)中私有變量不允許在類(lèi)之外的其他任何地方訪(fǎng)問(wèn),一般來(lái)說(shuō)功能完善的類(lèi)都會(huì)提供get,set方法來(lái)操作類(lèi)屬性值,但如果沒(méi)有g(shù)et、set方法都沒(méi)有提供,比如使用的是第三方提供的.o(或者動(dòng)態(tài)庫(kù))來(lái)進(jìn)行開(kāi)發(fā)的,并且實(shí)際應(yīng)用中我們確確實(shí)實(shí)需要改變其中某個(gè)對(duì)象的一個(gè)私有參數(shù),有沒(méi)有什么辦法呢?我們知道,一個(gè)進(jìn)程有程序段和數(shù)據(jù)段,如果我們知道了對(duì)象的數(shù)據(jù)空間,那么得到該對(duì)象的成員變量值也就很簡(jiǎn)單了,而實(shí)際上,對(duì)象數(shù)據(jù)段的首地址其實(shí)就是對(duì)象地址,以例子說(shuō)明:
class A
{
public:
int i;
bool setJ(int _j){j = _j;};
int getJ() const {return j;};
private:
int j;
};
int main()
{
A a;
printf("a's address is %u.n",&a); // 打印對(duì)象a的地址
printf("a.i's address is %u.n",(&(a.i))); // 打印對(duì)象a的成員變量i的地址
}
執(zhí)行上面程序,可以看到結(jié)果,兩個(gè)值時(shí)一樣的,也就是說(shuō)明對(duì)象地址就是第一個(gè)成員變量的地址。
我們知道,C++編譯器將數(shù)據(jù)和程序段分開(kāi),所有的類(lèi)變量會(huì)按照聲明順序依次存入數(shù)據(jù)段,所以,如果知道了第一個(gè)變量的地址,那么后面的地址也就依次累加即可逐一求出了。有了變量地址,那么也就可以對(duì)它的值進(jìn)行修改了。還是以上面的例子來(lái)說(shuō)明,一下程序編寫(xiě)了如何更改類(lèi)成員b的值:
int main()
{
A a;
a.setJ(2);
printf("before modified:the member j of a is %d.n",a.getJ()); // 打印j的值。
int *p = (int *)(int(&a) + sizeof(a.i));
*p = 10;
printf("after modified:the member j of a is %d.n",a.getJ()); // 打印j的值。
}
可以得出此時(shí)j成員變量的值由2變成10了。
總結(jié):直接對(duì)地址空間操作,請(qǐng)小心為妙。。。
此外,另附一篇與此類(lèi)似的文章,也很有啟發(fā)性。
分析程序員和黑客的區(qū)別
題目:
設(shè)有如下C++類(lèi)
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
};
請(qǐng)使用某種方式來(lái)在類(lèi)的外部改變私有成員A::value的值。
程序員的可能做法:
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
void SetValue(int n)
{
value = n;
}
};
void f()
{
A a;
a.SetValue(5);
}
黑客的可能做法:
void f()
{
A a;
*((int *)&a) = 5;
}
結(jié)論:
程序員習(xí)慣于遵循既有的限制來(lái)增加既有的東西。
黑客習(xí)慣于利用既有的東西來(lái)打破既有的限制。
到此這篇關(guān)于c++訪(fǎng)問(wèn)私有private成員變量的常用方法的文章就介紹到這了,更多相關(guān)c++私有private成員變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解
這篇文章主要介紹了標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹;可供參考2012-11-11
基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)系統(tǒng)
C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡(jiǎn)單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12

