есть, и если, что он делает?
.*
есть, и если, что он делает?
.*
Да, есть. Это оператор указателя на член для использования с типами указатель-член.
например.
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
}
Здесь A
- это struct, а ptr_to_memb
- указатель на int
член A
. .*
объединяет экземпляр A
с указателем на член, чтобы сформировать выражение lvalue, относящееся к соответствующему члену данного экземпляра A
obj
.
Указатель на элементы может быть указателем на члены данных или выполнять функции членов и даже "делать правильные вещи" для виртуальных членов функции.
например. этот выход программы 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;
}
Вы можете встретить этого оператора при использовании указателей-членов:
struct foo
{
void bar(void);
};
typedef void (foo::*func_ptr)(void);
func_ptr fptr = &foo::bar;
foo f;
(f.*fptr)(); // call
Также связан оператор ->*
:
func_ptr fptr = &foo::bar;
foo f;
foo* fp = &f;
(fp->*fptr)(); // call