サーチ…


構文

  • 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名で飾られた名前が必要です。
  • それは、 publicprotectedまたは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名で飾られた名前が必要です。
  • それは、 publicprotectedまたは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()


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow