函数名不是代表函数的入口地址吗?

cuilll 2013-08-30 11:26:29
#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;


class A
{
public:
int x;
A(int i){x=i;}

void fun1(int j)
{

x+=j;
cout<<"fun1:"<<x<<endl;
}


void fun2(int j)
{
x+=j;
cout<<"fun2:"<<x<<endl;
}

};


int main()
{
A c1(2),c2(5);

void (A::*pfun)(int)=A::fun1;//报错!!

(c1.*pfun)(5);

pfun=A::fun2;//报错!!

(c2.*pfun)(10);

return 0;
}






1>------ 已启动生成: 项目: Test, 配置: Debug Win32 ------
1>正在编译...
1>Test.cpp
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\test\test\test.cpp(37) : error C3867: “A::fun1”: 函数调用缺少参数列表;请使用“&A::fun1”创建指向成员的指针
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\test\test\test.cpp(41) : error C3867: “A::fun2”: 函数调用缺少参数列表;请使用“&A::fun2”创建指向成员的指针
1>生成日志保存在“file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\Test\Test\Debug\BuildLog.htm”
1>Test - 2 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========



函数名不是代表函数的入口地址吗?? 怎摸还要再次取地址 &A::fun1???
...全文
1843 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2013-08-30
  • 打赏
  • 举报
回复 3
函数名并不是函数地址的代表,这种误解与数组名就是指针一样犯了相同的错误。函数名是函数实体的代表,不是地址的代表,当然,你马上就会有疑问,平时我们不都是把函数名作为函数的地址吗?是的,我可以告诉你,函数名可以作为函数的地址,但是,绝大多数人都忽略了一个条件,从函数到指针的隐式转换是函数名在表达式中的行为,就是说,这个转换仅在表达式中才会发生,这仅是函数名众多性质中的一个,而非本质,函数名的本质就是函数实体的代表。 到了C++,由于C++规定,非静态成员函数的左值不可获得,因此非静态成员函数不存在隐式左值转换,即不存在像常规函数那样的从函数到指针的隐式转换,所以必须在非静态成员函数前使用&操作符才能获得地址。
赵4老师 2013-08-30
  • 打赏
  • 举报
回复
//仅对VC6
#include <stdio.h>
void fun1() {
    int f1=1;
    printf("fun1\n");
    printf("fun1\n");
}
void fun2() {
    int f2=2;
    printf("fun2\n");
}
void fun3() {
}
void main() {
    printf("sizeof(fun1)==%d\n",(int)fun2-(int)fun1);
    printf("sizeof(fun2)==%d\n",(int)fun3-(int)fun2);
}
//Debug
//sizeof(fun1)==80
//sizeof(fun2)==64
//Release
//sizeof(fun1)==32
//sizeof(fun2)==16
modyaj 2013-08-30
  • 打赏
  • 举报
回复
飞天御剑流 的博客写得很好 我觉得该多看看

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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