クラスへのデータ・メンバーと関数ポインタ

3414 ワード


クラスメンバーへのポインタ
C++言語では、クラスメンバーまたはメンバー関数を指すポインタを定義し、ポインタでクラスのメンバーにアクセスできます.これには、属性メンバーへのポインタとメンバー関数へのポインタが含まれます.
àデータ・メンバーへのポインタ
C++言語では、クラスメンバーを指すポインタを定義できます.属性メンバーが静的または非静的の場合、ポインタの使用も異なります.ここで、非静的データ・メンバーへのポインタ定義フォーマットは次のとおりです.
1.    <    > <  >::*<   > [ = &<  >::<       >] 

非静的データ・メンバーへのポインタは、定義時にクラスに関連付けられ、使用時に特定のオブジェクトに関連付けられている必要があります.
2.    <    >.*<            > 

静的データ・メンバーへのポインタの定義と使用は、通常のポインタと同じであり、定義時にクラスに関連付ける必要はなく、使用時に特定のオブジェクトに関連付ける必要もありません.
非静的メンバーmath,静的メンバーchineseを持つクラスstudentが定義されていると仮定し,コードはそれらを指すポインタ定義方法を示す.
1.           student s1;  
2.           int student::*pm=&student::math;    //         
3.           s1.*pm=100;                         //         
4.           int *pc=&student::chinese;          //        
5.           *pc=10;                             //       

解析:この例では、クラスの静的データメンバーchineseと非静的データメンバーmathをそれぞれ指すポインタpcとpmを定義します.pmにアクセスする場合は、クラスインスタンスを使用して修飾する必要があります.PCにアクセスすると、通常のポインタとは違いません.
àメンバー関数へのポインタ
非静的メンバー関数を指すポインタを定義するには、パラメータリストが同じで、戻りタイプが同じで、所属するタイプが同じである3つの側面でメンバー関数と一致する必要があります.次のフォーマットを定義します.
1.    <    >(<  >::*<   >)(<    >)[=&<  >::<       >] 

非静的メンバー関数へのポインタを使用する方法は、非静的データメンバーへのポインタを使用する方法と同じです.フォーマットは次のとおりです.
2.    (<    >.*<            >)(<    >); 

静的メンバー関数を指すポインタは通常のポインタと同じで、定義時にクラスに関連付ける必要はなく、使用時に特定のオブジェクトに関連付ける必要もありません.
3.    <    >(*<   >)(<    >)[=&<  >::<      >] 

クラスstudentには、非静的メンバー関数f 1、非静的メンバー関数f 2があると仮定し、コードは、それらを指す関数ポインタの定義方法を示す.
1.           student s1;  
2.           float (student::*pf1)()=&student::f1;       //              
3.           (s1.*pf1)();                 //                
4.           void (*pf2)()=&student::f2;  //             
5.           pf2();                       //         

解析:非静的メンバー関数を指す場合は、クラス名を修飾子とし、使用する場合はクラスのインスタンスを修飾子として使用する必要があります.静的メンバー関数を指す場合は、クラス名を修飾子として使用する必要はありません.
 
分析:
pointName = &ClassName::member; クラスで指定されたメンバーのアドレスをポインタ変数に割り当てます.ClassNameは定義されたクラス名で、memberはデータメンバー名です.コンパイルシステムはクラス名にストレージスペースを割り当てず,絶対アドレスも持たないことは明らかである.したがって、この付与値は、クラスが存在するオブジェクトに対するメンバーのオフセット量、すなわち相対アドレス(開始位置からのバイト数)をとる.クラス内の任意のメンバーに対して、オフセット量は定数です.
このポインタ変数の値は相対アドレスであり、オブジェクト内のデータ・メンバーの絶対アドレスではないため、このポインタ変数を単独で使用してデータ・メンバーにアクセスすることはできません.*pointNameなどは許可されていません.このポインタ変数はクラスのメンバーではないため、オブジェクトの共有データメンバーにのみアクセスできます.オブジェクトのプライベート・データ・メンバーにアクセスするには、メンバー関数で実装する必要があります.例は次のとおりです.
#include <iostream>
using namespace std;

class Point3d
{
public:
	Point3d(){x = y = z = -1;}
	float sum(){return x+y+z;}
public:
	float x,y,z;
	static float s;
};

float Point3d::s = 100;

int main () {
	cout<<Point3d::s<<endl;

	Point3d p3d;
	float Point3d::*pfm = &Point3d::x;
	cout<<p3d.*pfm<<endl;

	float *pfsm = &Point3d::s;
	cout<<*pfsm<<endl;

	float (Point3d::*pff)() = &Point3d::sum;
	cout<<(p3d.*pff)()<<endl;
}