原則上,
c++類中私有變數不允許在類之外的其他任何地方訪問,一般來說功能完善的類都會提供
get,set
方法來操作類屬性值,但如果沒有
get、
set方法都沒有提供,比如使用的是第三方提供的
.o(或者動態庫)來進行開發的,並且實際應用中我們確確實實需要改變其中某個物件的乙個私有引數,有沒有什麼辦法呢?我們知道,乙個程序有程式段和資料段,如果我們知道了物件的資料空間,那麼得到該物件的成員變數值也就很簡單了,而實際上,物件資料段的首位址其實就是物件位址,以例子說明:
class a
;int getj() const ;
private:
int j;
};int main()
執行上面程式,可以看到結果,兩個值時一樣的,也就是說明物件位址就是第乙個成員變數的位址。
我們知道,
c++編譯器將資料和程式段分開,所有的類變數會按照宣告順序依次存入資料段,所以,如果知道了第乙個變數的位址,那麼後面的位址也就依次累加即可逐一求出了。有了變數位址,那麼也就可以對它的值進行修改了。還是以上面的例子來說明,一下程式編寫了如何更改類成員
b的值:
int main()
可以得出此時
j成員變數的值由2變成
10了。
分析程式設計師和黑客的區別
題目:設有如下
c++類
class a
int getvalue()
};請使用某種方式來在類的外部改變私有成員
a::value
的值。程式設計師的可能做法:
class a
int getvalue()
void setvalue(int n)
};void f()
黑客的可能做法:
void f()
結論:程式設計師習慣於遵循既有的限制來增加既有的東西。
黑客習慣於利用既有的東西來打破既有的限制。
C 中訪問私有成員
首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...
C 中訪問私有成員
首先訪問乙個類的私有成員不是什麼好做法。大家都知道私有成員在外部是不能被訪問的。乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員造訪,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有時候,源 是別...
C 中訪問私有成員
首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...