C++プライベートメンバー関数へのアクセス方法
私が知っているのは3つの方法です.は、アドレスを介して にアクセスする.友元関数 を通過友元類 を通過
2つ目と3つ目は比較的一般的な方法で、1つ目はあまり一般的ではないかもしれません.
一、アドレスによるアクセス
この方法は,クラスの保存メカニズムであればクラス内にメンバー変数と虚関数しかないので,アドレスを用いてアクセスできる.
つまり
A a;*((int*)&a);実現する
まずaのアドレスを取り出し、int型のアドレスに変換し、最後に解で値に参照します.
二、友元関数を通過する
関数をクラスの友元として宣言すると、クラスは関数を自分の人として扱い、クラスのプライベートメンバー変数に直接アクセスできます.
三、友元類を通じて
上記と同様に、クラスとして宣言された友元であり、友元クラスはクラスのプライベートメンバー変数にアクセスできます.
2つ目と3つ目は比較的一般的な方法で、1つ目はあまり一般的ではないかもしれません.
一、アドレスによるアクセス
この方法は,クラスの保存メカニズムであればクラス内にメンバー変数と虚関数しかないので,アドレスを用いてアクセスできる.
つまり
A a;*((int*)&a);実現する
まずaのアドレスを取り出し、int型のアドレスに変換し、最後に解で値に参照します.
#include
using namespace std;
class A
{
public:
A()
{
a = 1;
b = 2;
c = 3;
}
private:
int a;
int b;
int c;
};
int main()
{
A a;
int b = *((int*)&a);
cout << b << endl;
int b2 = *((int*)&a+1);
cout << b2 << endl;
int b3 = *((int*)&a+2);
cout << b3 << endl;
system("pause");
return 0;
}
二、友元関数を通過する
関数をクラスの友元として宣言すると、クラスは関数を自分の人として扱い、クラスのプライベートメンバー変数に直接アクセスできます.
#include
using namespace std;
class A
{
void friend show();
public:
A(){ a = 1; }
private:
int a;
};
void show()
{
A a;
cout << a.a << endl;
}
int main()
{
show();
system("pause");
return 0;
}
三、友元類を通じて
上記と同様に、クラスとして宣言された友元であり、友元クラスはクラスのプライベートメンバー変数にアクセスできます.
#include
using namespace std;
class A;
class B
{
friend A;
public:
B(){ a = 1; }
private:
int a;
};
class A
{
public:
void show()
{
B b;
cout << b.a << endl;
}
};
int main()
{
A a;
a.show();
system("pause");
return 0;
}