точечный оператор звездочки в C++

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

.*
25
задан Josh Lee 30 March 2010 в 21:00
поделиться

2 ответа

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

Например.

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 - это структура, а 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;
}
30
ответ дан 28 November 2019 в 21:08
поделиться

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

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
13
ответ дан 28 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: