使用指向成员的指针(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
。
答案 0 :(得分:2)
当您声明指向成员数据的指针时,它不受任何特定实例的限制。如果您想知道给定实例的数据成员的地址,则需要在执行.*
或->*
后获取结果的地址。例如:
#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