C++クラス内のプライベートメンバー変数へのアクセス方法

2650 ワード

原則として、C++クラスのプライベート変数はクラス以外のどこにもアクセスできません.一般的に機能が完備しているクラスはget、setメソッドを提供してクラス属性値を操作し、友元アクセスを通じます.でも!しかし、get、setの方法が提供されていない場合、第三者が提供するものなどの友元も定義されていない.o(またはダイナミックライブラリ)を開発し、実際の応用では、あるオブジェクトのプライベートパラメータを変更する必要があるのは確かですが、どうすればいいのでしょうか.もう1つの文芸青年を比較する方法は、1つのプロセスにはプログラムセグメントとデータセグメントがあることを知っています.もし私たちがオブジェクトのデータ空間を知っていれば、そのオブジェクトのメンバー変数値を得るのも簡単ですが、実際には、オブジェクトのデータセグメントの最初のアドレスがオブジェクトアドレスであり、例で説明します.
方法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;
}

結論:
プログラマーは既存の制限に従って既存のものを増やすことに慣れている. 
ハッカーは既存のものを利用して既存の制限を破ることに慣れている.