C++访问类中私有成员变量的方法

19 篇文章 0 订阅
11 篇文章 0 订阅

原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有就是就是通过友元访问。但是!但如果没有getset方法都没有提供,也没有定义友元,比如使用的是第三方提供的.o(或者动态库)来进行开发的,并且实际应用中我们确确实实需要改变其中某个对象的一个私有参数,有没有什么办法呢?还有一种比较文艺青年的方法,我们知道,一个进程有程序段和数据段,如果我们知道了对象的数据空间,那么得到该对象的成员变量值也就很简单了,而实际上,对象数据段的首地址其实就是对象地址,以例子说明:

方法1:普通青年

友元方法:

#include<iostream.h>

class A
{
	int t;
public:
	A()
	{
		t=2002;//在构造函数中初始化成员变量t

	}
	friend class B;//声明友元类classB

};

class B
{
public:
	A a;
	int sum()
	{
		return a.t+1500;//友员class B访问class A中的私有成员变量t

	}
};

void main()
{
	B b;
	cout<<b.sum()<<endl;
}

方法2:文艺青年

内存地址操作法

我们知道,C++编译器将数据和程序段分开,所有的类变量会按照声明顺序依次存入数据段,所以,如果知道了第一个变量的地址,那么后面的地址也就依次累加即可逐一求出了。有了变量地址,那么也就可以对它的值进行修改了。还是以上面的例子来说明,一下程序编写了如何更改类成员b的值:

#include <iostream>
#include <string>
using namespace std;

class center
{
public:
	void setX(float _x){x=_x;}
	void setY(float _y){y=_y;}
	void setMeanValue(float avg){meanValue=avg;}
	float getX(){return x;}
	float getY(){return y;}
	float getMeanValue(){return meanValue;}
	center():x(0.0),y(0.0),meanValue(0.0){}
private:
	float x;
	float y;
	float meanValue;
};

int main()
{
	center A;
	//普通青年的赋值方法;
	A.setX(1.0);
	A.setY(4.0);
	A.setMeanValue(13.0);
	cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;
	
	//文艺青年的赋值方法;
	//*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
	float tmp = *((float*)&A);
	cout<<tmp<<endl;//输出A.x的值
	tmp = *((float*)&A + 1);
	cout<<tmp<<endl;//输出A.y的值
	*((float*)&A + 2)=2;//修改A.meanValue的值
	cout<<A.getMeanValue()<<endl;
}

你也可以通过友元的内存地址来操作,即通过class B 的内存地址访问 class A的私有成员。



此外,另附一篇与此类似的文章,也很有启发性。

分析程序员和黑客的区别 
题目: 
  设有如下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;
}



  结论: 
  程序员习惯于遵循既有的限制来增加既有的东西。 
  黑客习惯于利用既有的东西来打破既有的限制。


  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值