C++中的成员函数指针

5hcedyr0  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(97)

已关闭。此问题需要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”的类型,我不知道此数据类型

yjghlzjz

yjghlzjz1#

&X::f&X::a不是 * 指针 *。因为fa都是 * 非静态 * 成员,所以它们是 * 成员指针 *,无论命名和语法相似性如何,它们的行为都与 * 指针 * 非常不同。
成员指针(无论是函数还是数据成员)不表示地址。所以打印地址是没有意义的。
所以在标准库中也没有<<std::ostream的重载,它也不会接受一个成员指针。
但是,有一个重载将bool作为参数,可以隐式地将成员指针转换为bool。如果成员指针的值为空,则结果为false,否则为true。使用默认设置,true将打印为1

nwo49xxi

nwo49xxi2#

表达式&X::a不是一个可以在普通地址中使用的地址。它是一个成员的相对地址。它只能用于pointer to member
指向成员的指针可以转换为其他指向成员的指针和only with constraints。它们不能被转换为其他类型的指针或int。在这种情况下很难打印它们的值。
唯一可能的转换是转换为布尔值,这意味着要查看它是否为null。因为指向成员的指针可以是nullptr:

int X::*px = &X::a;
bool bx = px; std::cout << bx <<std::endl; 
px = nullptr; 
bool bn = px; std::cout << bn <<std::endl;

字符串
如果你想打印指向成员的指针的地址,你必须用一个对象解引用它:

std::cout << std::hex << &(xobj.*(&X::a)) << std::endl;


正如你所想象的,不可能使用技巧来解引用一个nullptr到成员或使用一个nullptr作为对象地址,因为解引用一个空指针是UB。顺便说一句,这不是一个真实的的问题,因为标准对对象的布局几乎没有保证,所以这个相对地址本身用处不大。

相关问题