gpt4 book ai didi

c++ - 指向成员函数的指针的地址是什么,没有虚拟也没有继承

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:34 25 4
gpt4 key购买 nike

我写了一些测试代码,找出成员函数的地址。但结果让我很困惑。代码是

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

class A
{
public:
A(char _a, char _b, char _c, char _t):a(_a), b(_b), c(_c), t(_t){}

private:
char t;
char a;
public:
char b;
char c;
void test1(){std::cout << a << std::endl;}
void test2(){std::cout << b << std::endl;}
void test3(){std::cout << c << std::endl;}
void test4(){std::cout << t << std::endl;}

static void print(){

char A::*pa = &A::a;
char A::*pb = &A::b;
char A::*pc = &A::c;
char A::*pt = &A::t;
printf("data member : %p, %p, %p, %p\n", pa, pb, pc, pt);

void (A::*pf1)() = &A::test3;
void (A::*pf2)() = &A::test2;
void (A::*pf3)() = &A::test3;
void (A::*pf4)() = &A::test2;
printf("function member : %p, %p, %p, %p\n", pf1, pf2, pf3, pf4 );
}
};

int main()
{
A::print();

//system("pause");//need on Dev-c++
return 0;
}

我在 ubuntu 上用 g++ 运行这段代码,在 Windows 上用 Dev-C++ 运行这段代码,结果是一样的

data member : 0x1, 0x2, 0x3, (nil)
function member : 0x8048780, (nil), 0x804874e, (nil)

为什么pf2和pf4是nil?

最佳答案

指向成员的指针不是常规指针,您可以通过打印指向成员的指针的大小和常规指针的大小来测试它。您拥有的代码表现出未定义的行为,但是如果您想要对结果进行简单的解释,printf 需要可变数量的参数,这是通过以某种先入为主的顺序将参数插入堆栈来实现的,并且添加一些关于调用中参数数量的额外信息。

在您的例子中,指向成员函数的指针按原样被压入(通常是常规指针大小的两倍),然后 printf 正在读取堆栈并解释那里的位作为常规指针。我的猜测(您必须阅读编译器/平台文档来验证这一点)是您只打印前两个参数,内容以逗号分隔。

一个稍微好一点的方法是创建一个指向成员函数的指针和一个适当大小的 char 数组的 union ,用指向成员的指针初始化它并通过数组打印十六进制值。

关于c++ - 指向成员函数的指针的地址是什么,没有虚拟也没有继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894753/

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