[转+修改]一般函数指针和类的成员函数指针
2012-07-09 11:57
148 查看
转载请注明原文网址(楼主稍作修改以适应C++标准,编译器g++):
http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html
函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。
1、指向一般函数的指针
函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数。
下面是一个指向函数的指针使用的例子。
2、指向类的成员函数的指针
类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。
下面是一个指向类的成员函数的指针的使用的例子,包括指向静态和非静态成员函数的指针的使用。
#include <iostream>
using namespace std;
class CA;
/*指向类的非静态成员函数的指针*/
typedef int (CA::*pClassFun)(int, int);
/*指向一般函数的指针*/
typedef int (*pGeneralFun)(int, int);
class CA
{
public:
int Max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
static int Sum(int a, int b)
{
return a + b;
}
/*类内部的接口函数,实现对类的非静态成员函数的封装*/
int Result(pClassFun fun, int a, int b)
{
return (this->*fun)(a, b);
}
};
/*类外部的接口函数,实现对类的非静态成员函数的封装*/
int Result(CA* pA, pClassFun fun, int a, int b)
{
return (pA->*fun)(a, b);
}
/*类外部的接口函数,实现对类的静态成员函数的封装*/
int GeneralResult(pGeneralFun fun, int a, int b)
{
return (*fun)(a, b);
}
int main()
{
CA ca;
int a = 3;
int b = 4;
cout<<"Test nonstatic member function pointer from member function:"<<endl;
cout<<"The maximum number between a and b is "<<ca.Result(&CA::Max, a, b)<<endl;
/*在C++和vs2010中,函数指针这个实参是写成&CA::Max的。必须加一个引用符号,不然会报一个错误,说函数缺少参数,应该是编译器理解成了要在这里直接调用Max方法。*/
cout<<"The minimum number between a and b is "<<ca.Result(&CA::Min, a, b)<<endl;
cout<<endl;
cout<<"Test nonstatic member function pointer from external function:"<<endl;
cout<<"The maximum number between a and b is "<<Result(&ca, &CA::Max, a, b)<<endl;
cout<<"The minimum number between a and b is "<<Result(&ca, &CA::Min, a, b)<<endl;
cout<<endl;
cout<<"Test static member function pointer: "<<endl;
cout<<"The sum of a and b is "<<GeneralResult(&CA::Sum, a, b)<<endl;
return 0;
}
http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html
函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。
1、指向一般函数的指针
函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数。
下面是一个指向函数的指针使用的例子。
2、指向类的成员函数的指针
类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。
下面是一个指向类的成员函数的指针的使用的例子,包括指向静态和非静态成员函数的指针的使用。
#include <iostream>
using namespace std;
class CA;
/*指向类的非静态成员函数的指针*/
typedef int (CA::*pClassFun)(int, int);
/*指向一般函数的指针*/
typedef int (*pGeneralFun)(int, int);
class CA
{
public:
int Max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
static int Sum(int a, int b)
{
return a + b;
}
/*类内部的接口函数,实现对类的非静态成员函数的封装*/
int Result(pClassFun fun, int a, int b)
{
return (this->*fun)(a, b);
}
};
/*类外部的接口函数,实现对类的非静态成员函数的封装*/
int Result(CA* pA, pClassFun fun, int a, int b)
{
return (pA->*fun)(a, b);
}
/*类外部的接口函数,实现对类的静态成员函数的封装*/
int GeneralResult(pGeneralFun fun, int a, int b)
{
return (*fun)(a, b);
}
int main()
{
CA ca;
int a = 3;
int b = 4;
cout<<"Test nonstatic member function pointer from member function:"<<endl;
cout<<"The maximum number between a and b is "<<ca.Result(&CA::Max, a, b)<<endl;
/*在C++和vs2010中,函数指针这个实参是写成&CA::Max的。必须加一个引用符号,不然会报一个错误,说函数缺少参数,应该是编译器理解成了要在这里直接调用Max方法。*/
cout<<"The minimum number between a and b is "<<ca.Result(&CA::Min, a, b)<<endl;
cout<<endl;
cout<<"Test nonstatic member function pointer from external function:"<<endl;
cout<<"The maximum number between a and b is "<<Result(&ca, &CA::Max, a, b)<<endl;
cout<<"The minimum number between a and b is "<<Result(&ca, &CA::Min, a, b)<<endl;
cout<<endl;
cout<<"Test static member function pointer: "<<endl;
cout<<"The sum of a and b is "<<GeneralResult(&CA::Sum, a, b)<<endl;
return 0;
}
相关文章推荐
- 一般函数指针和类的成员函数指针
- Item 16. 指向成员函数的指针
- c++类内接口调用其它函数传递成员指针问题(以二叉树举例)
- 如何得到类成员函数的指针(操作符.×和->*的使用)
- 空类指针调用成员函数 类内的this指针
- 成员函数指针与高性能的C++委托(下篇)[转帖]
- 指针数组,指针指向const成员函数
- 一般函数指针和类的成员函数指针
- 指向类成员函数的指针
- 通过一个非法的指针或者NULL指针调用成员函数会发生什么?
- 类成员函数返回(成员)函数指针,包装类调用外部类的成员方法
- 成员函数指针的应用
- 成员函数指针与高性能的C++委托(中篇)
- 成员函数指针【转贴】
- 成员函数指针与高性能的C++委托(转)
- C++ 成员函数指针的问题 pointer-to-member-function
- 成员函数指针与高性能的C++委托
- 一般函数指针和类的成员函数指针
- C++指针探讨 (三) 成员函数指针
- 针对上一篇指针问题详细说明(c++向函数传递指针并修改其指向的问题)