サーチ…
構文
Classという名前のクラスを想定します...
- タイプ* ptr =&Class :: member; //静的メンバーのみを指す
- クラス:: * ptr =&Class :: member; //非静的クラスメンバを指す
非静的クラスメンバへのポインタについては、次の2つの定義が与えられます。
- クラスインスタンス。
- クラス* p =&インスタンス;
クラスメンバ変数へのポインタ
- ptr =&Class :: i; //すべてのクラス内で変数iをポイントする
- インスタンス。* ptr = 1; //インスタンスのiにアクセスする
- p - > * ptr = 1; // pにアクセスする
クラスメンバ関数へのポインタ
- ptr =&Class :: F; //すべてのクラス内で関数 'F'をポイント
- (インスタンス。* ptr)(5); //インスタンスのFを呼び出します
- (p→ptr)(6); // pのFを呼び出します。
静的メンバー関数へのポインター
static
メンバー関数はスコープを除いて通常のC / C ++関数とまったく同じです:
-
class
内部にあるので、class
名で飾られた名前が必要です。 - それは、
public
、protected
またはprivate
なアクセス可能性を持っています。
したがって、 static
メンバー関数にアクセスしてそれを正しく装飾すると、 class
外の通常の関数のように関数を指すことができます:
typedef int Fn(int); // Fn is a type-of function that accepts an int and returns an int
// Note that MyFn() is of type 'Fn'
int MyFn(int i) { return 2*i; }
class Class {
public:
// Note that Static() is of type 'Fn'
static int Static(int i) { return 3*i; }
}; // Class
int main() {
Fn *fn; // fn is a pointer to a type-of Fn
fn = &MyFn; // Point to one function
fn(3); // Call it
fn = &Class::Static; // Point to the other function
fn(4); // Call it
} // main()
メンバ関数へのポインタ
クラスのメンバ関数にアクセスするには、インスタンス自体、またはそのインスタンスへのポインタまたは参照として、特定のインスタンスに「ハンドル」を持たせる必要があります。クラスインスタンスが与えられた場合、正しい構文を取得した場合、メンバーへのポインタを使用してメンバーのさまざまなメンバーを指すことができます。もちろん、ポインターはあなたが指しているものと同じ型であると宣言されなければなりません...
typedef int Fn(int); // Fn is a type-of function that accepts an int and returns an int
class Class {
public:
// Note that A() is of type 'Fn'
int A(int a) { return 2*a; }
// Note that B() is of type 'Fn'
int B(int b) { return 3*b; }
}; // Class
int main() {
Class c; // Need a Class instance to play with
Class *p = &c; // Need a Class pointer to play with
Fn Class::*fn; // fn is a pointer to a type-of Fn within Class
fn = &Class::A; // fn now points to A within any Class
(c.*fn)(5); // Pass 5 to c's function A (via fn)
fn = &Class::B; // fn now points to B within any Class
(p->*fn)(6); // Pass 6 to c's (via p) function B (via fn)
} // main()
メンバ変数へのポインタとは異なり(前の例では)、クラスインスタンスとメンバポインタの間の関連付けは、括弧で括られている必要があり.*
や->*
が奇妙ではないかのように十分な!)
メンバ変数へのポインタ
class
メンバーにアクセスするには、インスタンス自体、またはそのインスタンスへのポインターまたは参照として、特定のインスタンスへの「ハンドル」を持たせる必要があります。 class
インスタンスが与えられた場合、正しい構文を取得した場合、メンバーへのポインタを使用してメンバーのさまざまなメンバーを指すことができます。もちろん、ポインターはあなたが指しているものと同じ型であると宣言されなければなりません...
class Class {
public:
int x, y, z;
char m, n, o;
}; // Class
int x; // Global variable
int main() {
Class c; // Need a Class instance to play with
Class *p = &c; // Need a Class pointer to play with
int *p_i; // Pointer to an int
p_i = &x; // Now pointing to x
p_i = &c.x; // Now pointing to c's x
int Class::*p_C_i; // Pointer to an int within Class
p_C_i = &Class::x; // Point to x within any Class
int i = c.*p_C_i; // Use p_c_i to fetch x from c's instance
p_C_i = &Class::y; // Point to y within any Class
i = c.*p_C_i; // Use p_c_i to fetch y from c's instance
p_C_i = &Class::m; // ERROR! m is a char, not an int!
char Class::*p_C_c = &Class::m; // That's better...
} // main()
pointer-to-memberの構文には、いくつかの余分な構文要素が必要です。
- ポインタの型を定義するには、基本型とそれがクラスの中にあるという事実に言及する必要があります:
int Class::*ptr;
。 - クラスや参照を持っていて、それをポインタへのポインタとともに使用したい場合は、
.*
演算子(.
演算子に似てい.
)を使用する必要があります。 - クラスへのポインタを持ち、それをポインタへのポインタとともに使用する場合は、
->*
演算子(->
演算子に似ています)を使用する必要があります。
静的メンバー変数へのポインタ
static
メンバ変数は、スコープを除いて、通常のC / C ++変数とまったく同じです。
-
class
内部にあるので、class
名で飾られた名前が必要です。 - それは、
public
、protected
またはprivate
なアクセス可能性を持っています。
したがって、 static
メンバー変数にアクセスして正しく修飾すると、 class
外の通常の変数のように変数を指すことができます。
class Class {
public:
static int i;
}; // Class
int Class::i = 1; // Define the value of i (and where it's stored!)
int j = 2; // Just another global variable
int main() {
int k = 3; // Local variable
int *p;
p = &k; // Point to k
*p = 2; // Modify it
p = &j; // Point to j
*p = 3; // Modify it
p = &Class::i; // Point to Class::i
*p = 4; // Modify it
} // main()