Udostępnij za pośrednictwem


Operatory wskaźników do elementów członkowskich: .* i ->*

expression .* expression 
expression –>* expression

Uwagi

Operatory wskaźnik na element członkowski, .* i ->*, zwracają wartość określonego elementu członkowskiego klasy dla obiektu określonego po lewej stronie wyrażenia. Po prawej stronie należy określić element członkowski tej klasy. Poniższy przykład ilustruje sposób używania operatorów:

// 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;
}

Dane wyjściowe

m_func1
m_func1
1
2

W poprzednim przykładzie, wskaźnik na element członkowski, pmfn, jest używany do wywoływania funkcji elementu członkowskiego m_func1.Inny wskaźnik na element członkowski, pmd, jest używany do dostępu do elementu m_num.

Operator dwuargumentowy .* łączy swój pierwszy argument, który musi być obiektem o typie klasy, z jego drugim argumentem, który musi być typem wskaźnik na element członkowski.

Operator dwuargumentowy ->* łączy swój pierwszy argument, który musi być wskaźnikiem na obiekt o typie klasy, z jego drugim argumentem, który musi być typem wskaźnik na element członkowski.

W wyrażenie zawierającym operatora .* pierwszy argument musi być typem klasy oraz być dostępnym dla wskaźnika na element członkowski określony w drugim argumencie lub być typem do którego istnieje typ jednoznacznie dziedziczący po i do którego istnieje dostęp dla tej klasy.

W wyrażeniu zawierającym operatora —>*, pierwszy argument musi być typu "wskaźnika na typ klasy" o typie określonym w drugim argumencie, lub to musi być typu jednoznacznie dziedziczącym po tej klasie.

Przykład

Rozważmy poniższy fragment klasy i program:

// 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.
}

Wynik operatorów .* lub ->* wskaźnik na element członkowski jest obiektem lub funkcją o typie określonym w elemencie członkowskim określonym w deklaracji wskaźnika na element.Tak więc, w powyższym przykładzie, wynik wyrażenia ADerived.*pmfnFunc1() jest wskaźnikiem na funkcję, która zwraca typ void.Ten wynik jest wartością l, jeśli drugi argument jest wartością l.

[!UWAGA]

Jeżeli wynik jednego z operatorów wskaźnik na element członkowski to funkcja, wynik może używany tylko jako argument operatora wywołania funkcji.

Zobacz też

Informacje

Operatory języka C++

Operatory, pierwszeństwo i kojarzenie języka C++