有意思,重载函数的同名不同址
很简单的重载:
void f() {}
void f(int) {}
这样f就有两个地址了,这个相当有意思。你看,她不是同时有两个值了吗?这样就要求从上下文中才可以看出到底是哪个f。
void (*fp1)();
那么:fp1 = f;是可以的。因为编译器会找到 void f();。
现在如果我想让fp1得到void f(int);的地址呢?我想到了这样,相当“长”:
fp1 = reinterpret_cast<void(*)()>(static_cast<void(*)(int)>(f));
先用static_cast把f的void(*)(int)的语义带出来,然后就可以用reinterpret_cast转换成void(*)()了。
所以,对重载的函数,可以用static_cast引出特定的语义,也就是选择特定的函数地址。
下面是程序,Dev-C++4.9.8.0通过:
#include <iostream>
#include <cstdlib>
using namespace std;
void f() { int i; i = 1;}
void f(int) { int i; i = 1;}
int main ()
{
cout << "f() is " << (long)static_cast<void(*)()>(f) << endl;
cout << "f(int) is " << (long)static_cast<void(*)(int)>(f) << endl;
void (*fp1)();
void (*fp2)(int);
fp1=f;
cout << "fp1=f is " << (long)fp1 << endl;
fp2=f;
cout << "fp2=f is " << (long)fp2 << endl;
// Error: fp1=reinterpret_cast<void(*)()>(f);
fp1=reinterpret_cast<void(*)()>(static_cast<void(*)(int)>(f));
cout << "fp1=f(int) is " << (long)fp1 << endl;
system ("Pause");
return 0;
}
结果:
f() is 4199040
f(int) is 4199056
fp1=f is 4199040
fp2=f is 4199056
fp1=f(int) is 4199056