Opérateurs de pointeur vers Membre : . * et - >*
expression .* expression
expression –>* expression
Notes
Les opérateurs de pointeur. * et - >*, retournent la valeur d'un membre de classe spécifique pour l'objet spécifié sur le côté gauche de l'expression.La partie droite doit spécifier un membre de la classe.l'exemple suivant montre comment utiliser ces opérateurs :
// 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;
}
Sortie
m_func1
m_func1
1
2
Dans l'exemple précédent, un pointeur vers un membre, pmfn, est utilisé pour appeler la fonction membre m_func1.Un autre pointeur vers un membre, pmd, est utilisé pour accéder au membre d' m_num .
l'opérateur binaire. * combine son premier opérande, qui doit être un objet de type de classe, avec son deuxième, qui doit être un type de pointeur vers membre.
L'opérateur binaire - >* combine son premier opérande, qui doit être un pointeur vers un objet de type de classe, avec son deuxième, qui doit être un type de pointeur vers membre.
dans contenir d'expression. l'opérateur *, le premier opérande doit être du type de classe, et soit accessible, le décodage pointeur vers membre spécifié dans le deuxième ou d'un type accessible clairement dérivé et accessible à partir de cette classe.
Dans une expression contenant - l'opérateur d'>*, le premier opérande doit être de type « pointeur vers le type de classe » du type spécifié dans le deuxième, ou il doit être d'un type clairement dérivé de cette classe.
Exemple
considérez les classes et le fragment suivants de programme :
// 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.
}
le résultat du. * ou - les opérateurs de pointeur de membre à >* est un objet ou une fonction du type spécifié dans la déclaration de pointeur vers membre.Par conséquent, dans l'exemple précédent, le résultat de l'expression ADerived.*pmfnFunc1() est un pointeur vers une fonction qui retourne void.Ce résultat est une l-value si le deuxième est une l-value.
[!REMARQUE]
Si le résultat de l'un des opérateurs de pointeur est une fonction, le résultat peut être utilisé uniquement comme opérande de l'opérateur d'appel de fonction.