共用方式為


指標對成員運算子: .*->*

語法

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 之函式的指標。 如果第二個運算元是左值,則這個結果會是左值。

注意

如果其中一個成員指標運算子的結果是函式,則結果只能做為函式呼叫運算子的運算元使用。

另請參閱

C++ 內建運算子、優先順序和關聯性