为什么输出是1, 而不是实际的地址

oldrealman 2012-02-21 03:52:26
#include <iostream>
using namespace std;
class A
{
public:
int fun1(){};
int fun2(){};
};
int main(int argc, char **argv)
{
cout<<"abc.fun1 " << &A::fun1 <<&A::fun2<<endl;
return 1;
}

上面的代码为什么最后的输出是11?
...全文
160 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不应该获取成员函数指针的地址
在某些编译器下sizeof(void*) != sizeof(&A::fun1);
ppsharp 2012-02-21
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
class A
{
public:
static int fun1(){return 0;};
static int fun2(){return 0;};
};
int main(int argc, char **argv)
{
cout<<"function address: "<<endl;
cout<<&A::fun1<<endl;
cout<<&A::fun2<<endl;
getchar();
return 1;
}

这样输出的是函数地址。
A::fun1 这样调用函数,函数得是静态函数把,加static。
另外函数名前加不加&,输出的都是函数地址。
yisikaipu 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qixing1115 的回复:]不知道为啥,就顶吧[/Quote]

如果做如下重载,编译器报ambiguous

class A
{
public:
int fun1(){return 7;};
};

ostream& operator<<(ostream &o,bool b)
{
return o;
}

int main(int argc, char **argv)
{
cout <<&A::fun1;
return 0;
}


可见,这里是把&A::fun1转换为bool来处理

根据03标准$4.12/1
An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.

所以总是true,也就是1
无芒 2012-02-21
  • 打赏
  • 举报
回复
要知道 指针 存在一种情况 即是什么都不指的时候 null

所以在类中所有成员的偏移量(offset)的值(integer) 是他们offset的值加1

这样就能使用这个0值来代表 一个空的成员指针 (null pointer to data member)
qixing1115 2012-02-21
  • 打赏
  • 举报
回复
不知道为啥,就顶吧
乃不知有汉 2012-02-21
  • 打赏
  • 举报
回复
应该是cout的问题
不关你的事
不过说实话
你这样情况很少见
乃不知有汉 2012-02-21
  • 打赏
  • 举报
回复
你确定你用的我的代码?
VC6 VS2010 下都试过
oldrealman 2012-02-21
  • 打赏
  • 举报
回复
改代码如下,
int main(int argc, char **argv)
{
FUNCTYPE ptr = &A::fun1;
printf("%p\n", ptr);

printf("&A::fun1 = %p\n", &A::fun1);
cout<<"ptr is "<<ptr<<endl;
cout<<"abc.fun1 " << &A::fun1 <<&A::fun2<<endl;
return 1;
}
输出如下:
0x80488ca
&A::fun1 = 0x80488ca
ptr is 1
abc.fun1 11

说明是printf和cout的区别,是cout搞的鬼,刚开始用C++,是不是我用错cout了?
乃不知有汉 2012-02-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <STDIO.H>
using namespace std;
class A
{
public:
int n;
int fun1(){ return 1; }
int fun2(){ return 2; }
};



int main(int argc, char **argv)
{
typedef int ( A::* FUNCTYPE)();
FUNCTYPE ptr = &A::fun1;
printf("%p", ptr);
cout << endl << ptr << endl;

// cout<<"abc.fun1 " << ptr <<endl;
return 2;
}
oldrealman 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangjunsheng 的回复:]
看指针的值 你得这样
typedef int ( A::* FUNCTYPE)();
FUNCTYPE ptr = &A::fun1;
printf("%p", ptr); // 这样就对了

cout 的 << 输出成员函数的 重载存在问题,
cout << ptr << endl; // 固定为 1 !!!! bug!!!!
[/Quote]

不好意思,使用您的方法,结果也是1
oldrealman 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jim_king_2000 的回复:]
成员函数的指针是偏移量。
[/Quote]

但是加个fun2,&A::fun2也是1
乃不知有汉 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jim_king_2000 的回复:]
成员函数的指针是偏移量。
[/Quote]
这个应该是错的

成员函数的指针 很可能是一个 成员函数转化为全局函数后的地址
乃不知有汉 2012-02-21
  • 打赏
  • 举报
回复
看指针的值 你得这样
typedef int ( A::* FUNCTYPE)();
FUNCTYPE ptr = &A::fun1;
printf("%p", ptr); // 这样就对了

cout 的 << 输出成员函数的 重载存在问题,
cout << ptr << endl; // 固定为 1 !!!! bug!!!!
Jim_King_2000 2012-02-21
  • 打赏
  • 举报
回复
成员函数的指针是偏移量。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧