C++クラス内のプライベートメンバー変数へのアクセス方法
2650 ワード
原則として、C++クラスのプライベート変数はクラス以外のどこにもアクセスできません.一般的に機能が完備しているクラスはget、setメソッドを提供してクラス属性値を操作し、友元アクセスを通じます.でも!しかし、get、setの方法が提供されていない場合、第三者が提供するものなどの友元も定義されていない.o(またはダイナミックライブラリ)を開発し、実際の応用では、あるオブジェクトのプライベートパラメータを変更する必要があるのは確かですが、どうすればいいのでしょうか.もう1つの文芸青年を比較する方法は、1つのプロセスにはプログラムセグメントとデータセグメントがあることを知っています.もし私たちがオブジェクトのデータ空間を知っていれば、そのオブジェクトのメンバー変数値を得るのも簡単ですが、実際には、オブジェクトのデータセグメントの最初のアドレスがオブジェクトアドレスであり、例で説明します.
方法1:一般青年
友元メソッド:
方法2:文芸青年
メモリアドレス操作法
C++コンパイラはデータとプログラムセグメントを分離し,すべてのクラス変数が宣言順にデータセグメントに順次格納されることを知っているので,最初の変数のアドレスが分かれば,後のアドレスも順次加算して逐一求めることができる.変数アドレスがあれば、その値を変更することもできます.上記の例では、クラスメンバーbの値を変更する方法をプログラムが記述しています.
また、class Bのメモリアドレスを使用してclass Aのプライベートメンバーにアクセスすることもできます.
また、これと似たような文章が添付されているのも啓発的です.
プログラマーとハッカーの違いを分析するテーマ:以下のC++クラスがあります
クラスの外部でプライベートメンバーを変更するには、何らかの方法を使用します.
A::value
で行ないます.
プログラマーの可能なアプローチ:
ハッカーの可能性:
結論:
プログラマーは既存の制限に従って既存のものを増やすことに慣れている.
ハッカーは既存のものを利用して既存の制限を破ることに慣れている.
方法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;
}
結論:
プログラマーは既存の制限に従って既存のものを増やすことに慣れている.
ハッカーは既存のものを利用して既存の制限を破ることに慣れている.