已关闭。此问题需要details or clarity。它目前不接受回答。
**希望改进此问题?**通过editing this post添加详细信息并阐明问题。
2天前关闭。
截至2天前,社区正在审查是否重新讨论此问题。
Improve this question的
我在这一行std::cout << &X::a << std::endl;
这一行打印1应该打印地址&X::a
这是我的代码
#include <iostream>
#include <string>
#include <iomanip>
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 vslue of a is " << xobj.*ptrnumber << std::endl;
(xobj.*ptrfunction)(20);
std::cout << std::hex << &X::a << std::endl;
//std::cout << funcPtr << std::endl;
}
字符串
我用不同的编译器c++编译,但我有相同的输出
i显示了此“M1Xi”的类型,我不知道此数据类型
2条答案
按热度按时间yjghlzjz1#
&X::f
和&X::a
不是 * 指针 *。因为f
和a
都是 * 非静态 * 成员,所以它们是 * 成员指针 *,无论命名和语法相似性如何,它们的行为都与 * 指针 * 非常不同。成员指针(无论是函数还是数据成员)不表示地址。所以打印地址是没有意义的。
所以在标准库中也没有
<<
和std::ostream
的重载,它也不会接受一个成员指针。但是,有一个重载将
bool
作为参数,可以隐式地将成员指针转换为bool
。如果成员指针的值为空,则结果为false
,否则为true
。使用默认设置,true
将打印为1
。nwo49xxi2#
表达式
&X::a
不是一个可以在普通地址中使用的地址。它是一个成员的相对地址。它只能用于pointer to member。指向成员的指针可以转换为其他指向成员的指针和only with constraints。它们不能被转换为其他类型的指针或int。在这种情况下很难打印它们的值。
唯一可能的转换是转换为布尔值,这意味着要查看它是否为null。因为指向成员的指针可以是nullptr:
字符串
如果你想打印指向成员的指针的地址,你必须用一个对象解引用它:
型
正如你所想象的,不可能使用技巧来解引用一个nullptr到成员或使用一个nullptr作为对象地址,因为解引用一个空指针是UB。顺便说一句,这不是一个真实的的问题,因为标准对对象的布局几乎没有保证,所以这个相对地址本身用处不大。