为什么输出是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?
...全文
254 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
  • 打赏
  • 举报
回复
成员函数的指针是偏移量。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

65,210

社区成员

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

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