21xrx.com
2024-11-10 00:11:05 Sunday
登录
文章检索 我的文章 写文章
C++类函数指针:详解及应用
2023-07-05 04:22:21 深夜i     --     --
C++ 函数指针 详解 应用

C++是一种面向对象的编程语言,为了提高代码的可扩展性和可维护性,类成员函数相对于C函数更受欢迎,C++提供了一种特殊的指针——类函数指针,常用于与类有关的回调函数、操作函数及状态函数。

1.类函数指针的定义方式

由于类函数具有this指针作为类对象的指针,因此类函数指针必须包含该指针作为参数,其一般形式为:

返回类型(类::*指针名)(参数列表)

其中,类为类名,指针名可以自定义,参数列表可以为空。例如:

class A {

public:

  int fun(int a);

  static int staticFun(int a);

};

typedef int (A::*FUNPTR)(int);

2.类函数指针的使用方法

① 调用类的成员函数:

定义对象的指针,然后通过指针调用函数即可。

A a;

FUNPTR funPtr = &A::fun; // 获取成员函数指针

(a.*funPtr)(1); // 调用成员函数

② 函数回调:

将类的成员函数作为参数传递给函数,在函数内部获取对象指针并调用函数。

class B {

public:

  void func(FUNPTR f);

  int data;

};

void B::func(FUNPTR f) {

  (this->*f)(data);

}

int main() {

  A a;

  B b;

  b.data = 1;

  b.func(&A::fun); // 回调成员函数

  return 0;

}

③ 函数指针数组:

为了节省代码,常常将类的函数指针存在指针数组中,然后通过数组下标调用函数。

typedef int (A::*FUNPTR)(int);

FUNPTR funPtr[] = &A::fun;

A a;

(a.*(funPtr[0]))(1); // 等价于调用 a.fun(1);

3.注意事项

① 类函数指针只能指向属于该类的非静态成员函数,不能指向静态成员函数或全局函数。

② 函数指针可以用作函数回调,但是需要注意函数参数的类型和个数。

③ 在函数指针数组中,函数指针的类型必须相同。

④ 成员函数指针无法转换为普通函数指针,但可以通过static_cast将成员函数指针转换为另一个成员函数指针。

总之,类函数指针是C++特有的指针类型,可以方便地调用类成员函数,并用于函数回调和函数指针数组等多种场景,是提高代码可扩展性和可维护性的重要手段。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复