使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址
How Does Getting the Address of a Class Member Through a Scope Resolution Operator Work When Using a Pointer-to-Member?
当使用指向成员的指针(又名点星或箭头星)访问类成员时,我们可以使用以下语法:
A * pa;
int A::*ptm2 = &A::n;
std::cout << "pa->*ptm: " << pa->*ptm << 'n';
我的问题是&A::n
语句是如何工作的?
在上述示例中,n
是一个变量。如果n
不是成员变量,而是一个函数(我们定义了一个pointer-to-member函数,而不是pointer-to--member),我可能会认为,由于类的函数可以有效地是静态的(参见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: %pn", (void *)&(a.*ptm));
printf("aa.*ptm: %pn", (void *)&(aa.*ptm));
}
打印为一种可能的输出:
a.*ptm: 0xbfbe268c
aa.*ptm: 0xbfbe2688
相关文章:
- 在构造函数中输入对象时C++类成员作用域
- 用于返回嵌套类类型的作用域解析运算符
- 变量声明中结构的作用域解析是什么意思
- 模板类中静态函数或指针的作用域解析
- 作用域解析运算符和常量
- 模板子类作用域解析
- ::(作用域解析运算符)在C++中用于多种用途
- 使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址
- 带有继承的C++作用域解析用法
- ::c++中模板函数调用前面的作用域解析运算符
- 为什么作用域解析对覆盖的变量不起作用?
- isalnum的作用域解析运算符
- c++新内存替换和作用域解析
- 显式解析类成员的作用域
- 为什么c++的作用域解析操作符是::
- ::操作符能否出现在与限定名查找中的作用域解析不同的上下文中?
- c++语言中的块作用域解析
- 在类定义的类名中,作用域解析操作符的作用是什么?
- 关于c++中作用域解析操作符的问题
- 为什么基类构造函数没有被作用域解析操作符调用