c++訪問私有private成員變量的常用方法
類的對象不能直接訪問類聲明的私有成員變量,否則破壞了信息隱藏的目的。
在C++中,為了防止某些數(shù)據(jù)成員或成員函數(shù)從外部被直接訪問,可以將它們聲明為private,這樣編譯器會(huì)阻止任何來自外部非友元的直接訪問。
私有成員變量的常用訪問方法如下:
(1)通過公共函數(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)利用指針訪問私有數(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ù)訪問私有數(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)利用引用訪問私有數(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ǔ)充
訪問C++類對象中私有成員變量的方法
原則上,C++類中私有變量不允許在類之外的其他任何地方訪問,一般來說功能完善的類都會(huì)提供get,set方法來操作類屬性值,但如果沒有g(shù)et、set方法都沒有提供,比如使用的是第三方提供的.o(或者動(dòng)態(tài)庫)來進(jìn)行開發(fā)的,并且實(shí)際應(yīng)用中我們確確實(shí)實(shí)需要改變其中某個(gè)對象的一個(gè)私有參數(shù),有沒有什么辦法呢?我們知道,一個(gè)進(jìn)程有程序段和數(shù)據(jù)段,如果我們知道了對象的數(shù)據(jù)空間,那么得到該對象的成員變量值也就很簡單了,而實(shí)際上,對象數(shù)據(jù)段的首地址其實(shí)就是對象地址,以例子說明:
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); // 打印對象a的地址 printf("a.i's address is %u.n",(&(a.i))); // 打印對象a的成員變量i的地址 }
執(zhí)行上面程序,可以看到結(jié)果,兩個(gè)值時(shí)一樣的,也就是說明對象地址就是第一個(gè)成員變量的地址。
我們知道,C++編譯器將數(shù)據(jù)和程序段分開,所有的類變量會(huì)按照聲明順序依次存入數(shù)據(jù)段,所以,如果知道了第一個(gè)變量的地址,那么后面的地址也就依次累加即可逐一求出了。有了變量地址,那么也就可以對它的值進(jìn)行修改了。還是以上面的例子來說明,一下程序編寫了如何更改類成員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é):直接對地址空間操作,請小心為妙。。。
此外,另附一篇與此類似的文章,也很有啟發(fā)性。
分析程序員和黑客的區(qū)別
題目:
設(shè)有如下C++類
class A { int value; public: A(int n = 0) : value(n) {} int GetValue() { return value; } };
請使用某種方式來在類的外部改變私有成員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í)慣于遵循既有的限制來增加既有的東西。
黑客習(xí)慣于利用既有的東西來打破既有的限制。
到此這篇關(guān)于c++訪問私有private成員變量的常用方法的文章就介紹到這了,更多相關(guān)c++私有private成員變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中main函數(shù)兩個(gè)參數(shù)的作用
這篇文章主要介紹了C語言中main函數(shù)兩個(gè)參數(shù)的作用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

JetBrains?CLion永久激活超詳細(xì)教程(最新激活方法)

C++?Boost?weak_ptr智能指針超詳細(xì)講解