3

当使用指向成员的指针(AKA 点星或箭头星)来访问类成员时,我们可以使用以下语法:

A * pa;
int A::*ptm2 = &A::n;
std::cout << "pa->*ptm: " << pa->*ptm << '\n';

我的问题是声明是如何&A::n工作的?

在上面的例子n中是一个变量。如果不是一个成员变量,而是n一个函数(并且我们定义了一个指向成员函数的指针而不是指向成员的指针),我可能会认为因为类的函数可以是有效的静态函数(参见Nemo 的评论),我们可以通过&A::some_function. 但是我们如何通过类作用域解析来获取非静态类成员的地址呢?当我打印 的值时,这更加令人困惑,&A::n因为输出仅仅是1.

4

1 回答 1

2

当您声明一个指向成员数据的指针时,它不会绑定到任何特定的实例。如果您想知道给定实例的数据成员的地址,您需要在执行.*or之后获取结果的地址->*。例如:

#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
于 2013-07-19T22:09:36.300 回答