操作C++类中私有变量的值

来源:互联网 时间:1970-01-01

很久之前在黑客动画吧主页看到一篇关于改变类中私有变量值的文章,可惜当时还不懂C++,看不懂文章内容,但按照常识也知道类中私有变量只是可以在类中改变的,不然私有这个特性就没有意义,所以当时就是不明觉厉的感觉,当然,这篇文章也给我留下很深刻的印象。 今天看JavaScript的时候突然就想起这篇文章了,所以就着手试试能不能重现之前文章的内容

0001 原理 当然,任何实现都会有一个原理,下面介绍一下原理(理论帝又出现了)。 我们知道,变量都是储存在内存当中,而访问变量都是通过变量的内存地址来进行的。 而我们平时写代码的时候定义的变量名是为了方便程序猿,高级语言的一个特性,但这些变量名经过编译器编译之后都会转换成内存地址。 所以一切变量的操作都是要通过变量内存地址进行的。 自然,我就想到可不可以通过获取类中私有变量内存地址来操作它的值。 以下是我的猜想(注意,以下只是我的猜想): 类私有的特性是对于程序猿来说的,而实际数据的存储是不区分私有和共有,都是“平等地”存储在内存中。 类的私有只是在编写代码的时候不能在类外部直接操作类中的私有的变量(当然也包括私有函数),但通过指针这个媒介来操作还是可以的。0002 代码实现 #include class TEST{ public: int *b; private: int a=2; private: void setpoint(){ b=&a; } public: int ** getpoint(){ setpoint(); return &b; } public: int changevalue(int value){ *b=value; return getvalue(); } public: int getvalue(){ setpoint(); return *b; } }; int main(int argc, const char * argv[]) { TEST t; int chvalue; int *point; std::cout std::cout std::cout std::cout //以下代码为改变私有变量的值 std::cin>>chvalue; point=*t.getpoint(); *point=chvalue; std::cout std::cout return 0; }复制代码0003 运行后的输出 0x7fff5fbff8d0 2 4 0x7fff5fbff8d0 9 //这个是我的输入 9 0x7fff5fbff8d0 (在 OS X 系统中运行)复制代码0004 代码的说明 main函数中分成三段,第一段是变量声明之类的不用说了。 第二段是利用类中函数来操作类中私有变量的值,这个算是很常见的操作,没什么特别的。 主要是第三段,第三段中完全是在main函数中进行的操作,利用类中的函数获取私有变量的地址,再通过给该内存地址赋值来改变原来的值。 通过运行的输出也可以看到,类中私有变量 a 的值已经改变为我输入的9,最后通过输出变量的地址知道程序是没有另外开辟内存来存放9这个数值的。至此已实现在类外部修改类中私有变量的值。0005 结语 以上只是一个实验性的操作,这个实验对现实的开发和信息安全中有什么影响还不清楚,哪位大牛知道的可以告知一下,又或者大家能讨论一下,我在这里也算是抛砖引玉。



相关阅读:
Top