从下面的代码片段我得到的函数地址是1.为什么?
#include<iostream>
using namespace std;
int add(int x, int y)
{
int z;
z = x+y;
cout<<"Ans:"<<z<<endl;
}
int main()
{
int a=10, b= 10;
int (*func_ptr) (int,int);
func_ptr = &add;
cout<<"The address of function add()is :"<<func_ptr<<endl;
(*func_ptr) (a,b);
}
答案 0 :(得分:8)
函数指针不能转换为数据指针。如果您尝试将一个编译器分配给void*
变量,则会出现编译器错误。但它们可以隐式转换为bool
!
这就是选择bool
operator<<
const void*
超载#include<iostream>
using namespace std;
int add(int x, int y)
{
int z;
z = x+y;
cout<<"Ans:"<<z<<endl;
}
int main()
{
int a=10, b= 10;
int (*func_ptr) (int,int);
func_ptr = &add;
cout<<"The address of function add()is :"<< reinterpret_cast<void*>(func_ptr) <<endl;
(*func_ptr) (a,b);
}
的原因。
为了强制你想要的过载,你需要使用非常强大的C ++强制转换,几乎完全忽略静态类型信息。
{{1}}
请注意,只有条件地支持将函数指针作为数据指针进行转换和处理(从C ++标准角度来看)。将它用于转换为相同函数指针以外的任何其他内容都将具有特定于实现的结果,这在编译器中非常有用。
答案 1 :(得分:3)
使用的重载是
ostream& ostream::operator<< (bool val);
由于函数指针不为空,因此打印1
。