/*
**test20.cpp : Defines the entry point for the console application.
**系统winXP SP3 32位.
**函数指针与用函数指针调用类的非静态成员函数原理
*/
#include "stdafx.h"
#include "iostream.h"
class CTest{
public:
void f1(){cout<<"CTest::f1()"<<endl;}
static void f2(){cout<<"CTest::f2()"<<endl;}
virtual void f3(){cout<<"CTest::f3()"<<endl;}
};
int main(int argc, char* argv[])
{
typedef void(*Cp1)(void); //指向参数为空,返回值为空的全局函数指针
Cp1 pf2 = CTest::f2;
pf2(); //CTest::f2(),通过函数指针调用静态函数
typedef void (CTest::*Cp2)(void); //指向参数为空,返回值为空的成员函数指针
Cp2 pf1 = &CTest::f1;
Cp2 pf3 = &CTest::f3;
CTest ct;
(ct.*pf1)(); //CTest::f1(),使用对象调用
(ct.*pf3)(); //CTest::f3(),使用对象调用
CTest* pct = &ct;
(pct->*pf1)(); //CTest::f1(),使用对象指针调用
(pct->*pf3)(); //CTest::f3(),使用对象指针调用
return 0;
}
Tips1:函数指针就是指向函数首地址的指针,必须在编译的时候确定下来,即这个地址是个常量。
Tips2:函数名就是函数的首地址,所以可以把函数名直接赋值给函数指针变量,而不用&符
Tips3:关于调用:1.直接把函数指针当做函数名来调用,与普通函数调用一致。
2.把函数指针的引用*做函数名
Tips4:关于类的成员函数的函数指针:1.类的静态成员函数不依赖类的存在而存在
2.其实在c语言中,任何成员函数的代码体都是独立于类对象存在,就是说没有使用这个类其也在内存中存在,只是非静态的函数在编译时候会加上前缀名,经此处理后都变成了全局函数,并且this作为其第一个参数,综上,所以用函数指针也能成功调用类的非静态成员函数。