C++中输出&X::a显示1而非成员变量地址的问题求助
问题分析与解决
为什么输出1?
&X::a的类型是指向类X的int成员的指针(int X::*),并非普通的对象指针(int*)。C++标准库的std::ostream没有为这种成员指针类型重载operator<<,编译器会执行隐式类型转换:将非空的成员指针转为布尔值true,输出时true会被打印为1。
关于类型M1Xi
这是编译器对int X::*类型做**名字修饰(name mangling)**后的结果。不同编译器修饰规则有差异,这里的M代表Member(成员),1关联成员在类中的偏移信息,X是类名,i是int的缩写。
如何正确输出成员指针的值?
要输出成员指针的实际值(通常是成员在类中的偏移量),需将其转换为可输出的整数类型或void*。推荐用std::uintptr_t(需包含<cstdint>头文件)保证跨平台兼容性:
修改后的代码片段
#include <iostream> #include <string> #include <iomanip> #include <cstdint> // 添加此头文件 class X { public: int a; void f(int b); }; void X::f(int b) { std::cout << "the value of b is " << b << std::endl; } void add() { std::cout << "Hello this function hello" << std::endl; } int main() { void (*funcPtr)(void) = add; funcPtr(); int X::*ptrnumber = &X::a; void (X::*ptrfunction)(int) = &X::f; X xobj; xobj.*ptrnumber = 10; std::cout << "the value of a is " << xobj.*ptrnumber << std::endl; (xobj.*ptrfunction)(20); // 转换为uintptr_t后输出 std::cout << std::hex << reinterpret_cast<std::uintptr_t>(&X::a) << std::endl; }
也可直接转换为void*(部分编译器可能发出警告,但多数场景可正常运行):
std::cout << std::hex << reinterpret_cast<void*>(&X::a) << std::endl;
你的测试代码中,X是普通非虚类,&X::a的偏移量为0,最终会输出十六进制的0。
内容的提问来源于stack exchange,提问作者Hassan Lakhal
相关产品推荐
相关产品推荐

