指针到成员运算符: .*->*

语法

pm-expression:
  cast-expression
  pm-expression .* cast-expression
  pm-expression ->* cast-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

在前面的示例中,指向成员 pmfn的指针用于调用成员函数 m_func1。 指向成员 pmd的另一个指针用于访问 m_num 该成员。

二进制运算符 .* 将其第一个作数(必须是类类型的对象)与第二个作数(必须是指针到成员类型)组合在一起。

二进制运算符 ->* 将第一个作数(必须是指向类类型的对象的指针)与第二个作数(必须是指针到成员类型)组合在一起。

在包含运算符的 .* 表达式中,第一个作数必须是类类型的指针,并且必须可供访问,指向第二个作数中指定的成员的指针或可访问的类型明确派生自该类并可供该类访问。

在包含运算符的 ->* 表达式中,第一个作数必须是第二个作数中指定的类型的“指向类类型的指针”的类型,或者它必须明确派生自该类的类型。

示例:

请考虑以下类和程序片段:

// 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() 的结果是指向返回 void的函数的指针。 如果第二个作数为 l 值,则此结果是 l 值。

注释

如果指针到成员运算符之一的结果是函数,则结果只能用作函数调用运算符的作数。

另请参阅

C++内置运算符、优先级和关联性