函数名不是代表函数的入口地址吗?
#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???
函数名? 入口地址 指向成员的指针
[解决办法]
函数名并不是函数地址的代表,这种误解与数组名就是指针一样犯了相同的错误。函数名是函数实体的代表,不是地址的代表,当然,你马上就会有疑问,平时我们不都是把函数名作为函数的地址吗?是的,我可以告诉你,函数名可以作为函数的地址,但是,绝大多数人都忽略了一个条件,从函数到指针的隐式转换是函数名在表达式中的行为,就是说,这个转换仅在表达式中才会发生,这仅是函数名众多性质中的一个,而非本质,函数名的本质就是函数实体的代表。
到了C++,由于C++规定,非静态成员函数的左值不可获得,因此非静态成员函数不存在隐式左值转换,即不存在像常规函数那样的从函数到指针的隐式转换,所以必须在非静态成员函数前使用&操作符才能获得地址。
[解决办法]
飞天御剑流 的博客写得很好 我觉得该多看看
------解决方案--------------------
//仅对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