跳转至

函数指针

1. 不涉及到类的情况

C++
int foo(int a) {
  return 2 * a;
}

int f1() {
  int (*fooptr)(int);
  fooptr = foo;
  cout << fooptr(2);
}

int f2() {
  decltype(foo) *fooptr = foo;  // auto *fooptr = foo;
  cout << fooptr(2);
}

2. 有类的情况

https://blog.csdn.net/qq_31073871/article/details/103069449

https://blog.csdn.net/Think88666/article/details/86100915

https://blog.csdn.net/weixin_43597743/article/details/89928838

在C++中,要想写一个指向成员函数的函数指针,以上知识就不够用了。

成员函数地址为: &类名::成员函数名,与上面的C语言风格相比,这里必须要加&符号。 指向成员函数的函数指针变量的定义方法: 把函数名替换为你喜欢的变量名,前加上【类名::】,并把【类名::变量名】用()括起来。 指向成员函数的函数指针类型的定义方法: 把上一步的变量名替换成你喜欢的类型名,并在前面加typedef。 例子:

(1)定义成员函数readAge:

C++
class Person
{
public :
    int readAge(void);
}

(2)定义函数指针变量pFunc指向readAge函数:

C++
int (Person::*pFunc)(void);
pFunc = &Person::readAge;

(3)定义函数指针类型Person::ReadFunc,并用这个类型定义一个函数指针变量pFunc ,指向readAge这个成员函数

C++
typedef int (Person::*ReadFunc)(void);
Person::ReadFunc pFunc =  &Person::readAge;

类型名也可不带类名前缀,简写为:ReadFunc pFunc = &Person::readAge;

(4)在本类的别的成员函数中通过函数指针变量pFunc ,调起readAge这个成员函数

C++
Person::ReadFunc pFunc =  &Person::readAge;
int a = (this->*pFunc)();

(5)在类外,通过函数指针, 调起这个成员函数

C++
Person tom;
Person::ReadFunc pFunc =  &Person::readAge;
int a = (tom.*pFunc)();

(6)常见编译错误: 由上面(4/5)两点可见,用函数指针调起成员函数,必须要有对象操作,具体来说就是体现为【this->】或者【obj.】或者【pObj->】,而不能像C语言一样,直接用函数指针调用,例如上面第(4)条,如果按C语言的方法来写: Person::ReadFunc pFunc = &Person::readAge; int a =pFunc();//这一行按照C语言语法来看,没毛病,但在C++中编译报错 编译错误提示为:error: C2064: 项不会计算为接受 xx 个参数的函数。(博主注:xx等于你传入的实参数目)

这个编译错误对程序员来说,过于隐晦,让人不明所以,感觉驴头不对马嘴,这里特意记录一下。