函数指针与用函数指针调用类的非静态成员函数原理解读

/*

**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()"<

static void f2(){cout<<"CTest::f2()"<

virtual void f3(){cout<<"CTest::f3()"<

};

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作为其第一个参数,综上,所以用函数指针也能成功调用类的非静态成员函数。

你可能感兴趣的:(函数指针与用函数指针调用类的非静态成员函数原理解读)