Как работает получение адреса члена класса через оператор разрешения области при использовании указателя на член?

При использовании указателя на член (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,

3

Решение

Когда вы объявляете указатель на данные члена, он не привязан ни к какому конкретному экземпляру. Если вы хотите узнать адрес члена данных для данного экземпляра, вам нужно взять адрес результата после выполнения .* или же ->*, Например:

#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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]