При использовании указателя на член (AKA точка-звезда или стрелка-звезда) для доступа к члену класса мы можем использовать следующий синтаксис:
A * pa;
int A::*ptm2 = &A::n;
std::cout << "pa->*ptm: " << pa->*ptm << '\n';
Мой вопрос в том, как &A::n
Скажите работа?
В приведенном выше примере n
переменная Если вместо переменной-члена, n
была функция (и мы определяли указатель на функцию-член вместо указателя на член), я могу предположить, что, поскольку функции класса могут быть эффективно статическими (см. комментарий Немо), мы могли бы найти адрес функции класса через &A::some_function
, Но как мы можем получить адрес нестатического члена класса через разрешение области видимости класса? Это еще более запутанно, когда я печатаю значение &A::n
потому что выход просто 1
,
Когда вы объявляете указатель на данные члена, он не привязан ни к какому конкретному экземпляру. Если вы хотите узнать адрес члена данных для данного экземпляра, вам нужно взять адрес результата после выполнения .*
или же ->*
, Например:
#include <stdio.h>
struct A
{
int n;
};
int main()
{
A a = {42};
A aa = {55};
int A::*ptm = &A::n;
printf("a.*ptm: %p\n", (void *)&(a.*ptm));
printf("aa.*ptm: %p\n", (void *)&(aa.*ptm));
}
печатает как один из возможных выходных данных:
a.*ptm: 0xbfbe268c
aa.*ptm: 0xbfbe2688
Других решений пока нет …