Подтвердить что ты не робот

Оператор звездочки в С++

есть, и если, что он делает?

.*
4b9b3361

Ответ 1

Да, есть. Это оператор указателя на член для использования с типами указатель-член.

например.

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

Ответ 2

Вы можете встретить этого оператора при использовании указателей-членов:

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