ポインター メンバー演算子: 。* - と >*
expression .* expression
expression –>* expression
解説
ポインターメンバー演算子。* – >* とは式の左辺に指定されたオブジェクトの特定のクラス メンバーの値を返します。右側はクラスのメンバーを指定する必要があります。次の例はこれらの演算子を使用する方法を示しています :
// expre_Expressions_with_Pointer_Member_Operators.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Testpm {
public:
void m_func1() { cout << "m_func1\n"; }
int m_num;
};
// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and
// m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;
int main() {
Testpm ATestpm;
Testpm *pTestpm = new Testpm;
// Access the member function
(ATestpm.*pmfn)();
(pTestpm->*pmfn)(); // Parentheses required since * binds
// less tightly than the function call.
// Access the member data
ATestpm.*pmd = 1;
pTestpm->*pmd = 2;
cout << ATestpm.*pmd << endl
<< pTestpm->*pmd << endl;
delete pTestpm;
}
出力
m_func1
m_func1
1
2
前の例ではメンバー関数 m_func1 を開始するにはメンバーpmfn へのポインターを使用しています。メンバー pmd別のポインターm_num のメンバーにアクセスするために使用されます。
二項演算子。* 結合クラス型のオブジェクトであるポインターからメンバーの型である 2 番目のオペランドがない 1 番目のオペランド。
二項演算子 – >* はクラス型のオブジェクトへのポインターであるポインターからメンバーの型である 2 番目のオペランドがない 1 番目のオペランドを結合します。
含む式。* 演算子はクラス型1 番目のオペランドになりアクセスできますが2 番目のオペランドで明確にクラスから派生しにアクセスできるアクセスできる型の指定したメンバーへのポインターである。
含む式では>* の演算子は 「 2 番目のオペランドで指定された型のクラス型へのポインター」1 番目のオペランドであるかが明確にクラスから派生した型である必要があります。
使用例
次のクラスはプログラムのフラグメントを検討します :
// expre_Expressions_with_Pointer_Member_Operators2.cpp
// C2440 expected
class BaseClass {
public:
BaseClass(); // Base class constructor.
void Func1();
};
// Declare a pointer to member function Func1.
void (BaseClass::*pmfnFunc1)() = &BaseClass::Func1;
class Derived : public BaseClass {
public:
Derived(); // Derived class constructor.
void Func2();
};
// Declare a pointer to member function Func2.
void (Derived::*pmfnFunc2)() = &Derived::Func2;
int main() {
BaseClass ABase;
Derived ADerived;
(ABase.*pmfnFunc1)(); // OK: defined for BaseClass.
(ABase.*pmfnFunc2)(); // Error: cannot use base class to
// access pointers to members of
// derived classes.
(ADerived.*pmfnFunc1)(); // OK: Derived is unambiguously
// derived from BaseClass.
(ADerived.*pmfnFunc2)(); // OK: defined for Derived.
}
の結果。* –または >* のポインターメンバー演算子はメンバーへのポインターの宣言で指定される型のオブジェクトまたは関数です。したがって前の例ではADerived.*pmfnFunc1() 式の結果を返すおよび関数へのポインターです。この結果を 2 番目のオペランドは左辺値で左辺値です。
[!メモ]
ポインターメンバー演算子の 1 の結果が関数の場合関数呼び出し演算子のオペランドとしてのみ使用できます。