gpt4 book ai didi

c++ - 使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址?

转载 作者:太空狗 更新时间:2023-10-29 21:45:23 24 4
gpt4 key购买 nike

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

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

最佳答案

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

#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

关于c++ - 使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com