2010-03-30 18 views

Respuesta

26

Sí, la hay. Es el operador de puntero a miembro para usar con tipos de puntero a miembro.

E.g.

struct A 
{ 
    int a; 
    int b; 
}; 

int main() 
{ 
    A obj; 
    int A::* ptr_to_memb = &A::b; 

    obj.*ptr_to_memb = 5; 

    ptr_to_memb = &A::a; 

    obj.*ptr_to_memb = 7; 

    // Both members of obj are now assigned 
} 

Aquí, A es una estructura y ptr_to_memb es un puntero a int miembro del A. El .* combina una instancia A con un puntero al miembro para formar una expresión lvalue que hace referencia al miembro correspondiente de la instancia A dada obj.

Puntero a miembros pueden ser indicadores para miembros de datos o miembros de la función e incluso 'harán lo correcto' para miembros de funciones virtuales.

E.g. este programa produce f(d) = 1

struct Base 
{ 
    virtual int DoSomething() 
    { 
     return 0; 
    } 
}; 

int f(Base& b) 
{ 
    int (Base::*f)() = &Base::DoSomething; 
    return (b.*f)(); 
} 

struct Derived : Base 
{ 
    virtual int DoSomething() 
    { 
     return 1; 
    } 
}; 

#include <iostream> 
#include <ostream> 

int main() 
{ 
    Derived d; 
    std::cout << "f(d) = " << f(d) << '\n'; 
    return 0; 
} 
12

puede encontrarse con que el operador cuando el uso de punteros miembros:

struct foo 
{ 
    void bar(void); 
}; 

typedef void (foo::*func_ptr)(void); 

func_ptr fptr = &foo::bar; 
foo f; 

(f.*fptr)(); // call 

También relacionado es el operador ->*:

func_ptr fptr = &foo::bar; 
foo f; 
foo* fp = &f; 

(fp->*fptr)(); // call 
+0

No solo para miembros _funcion_ punteros. – sbi

+0

No es una combinación, es realmente un solo operador (según §§ 2.12, 5.5 del estándar). FWIW, '-> *' también es un operador único (mismas referencias). –

+0

@sbi: ¿De qué estás hablando ...? :) @Jerry: Quise decir combinación de símbolos reales, no combinación de operadores. Supongo que es confuso. – GManNickG