函数指针与typedef和using的类型声明
typedef
typedef
是C/C++中一个经典的关键词,用于为数据类型定义一个新的名称,但可读性比较差,尤其是和函数指针结合起来使用非常令人迷惑。举个例子:
typedef int* IntPtr; // 将IntPtr类型解释为int*
表明我们可以用IntPtr
来表示一个int
型指针。在使用时int* a = nullptr
就和IntPtr a = nullptr
完全等价。
而typedef
在声明函数指针类型时会更让人迷惑。例如:
int func(char chr, double val) {
// do something
}
typedef int (*FunctionType)(char, double);
FunctionType func_ptr = &func; // &可以不加
表明我们声明一个名为FunctionType
的函数指针类型(返回值为int,参数类型为char和double)。为了使用这个类型,我们需要定义一个FunctionType
类型的对象func_ptr
,并指向函数func
。
using
针对这种问题,C++11之后推荐使用using
关键词来声明类型别名。与typedef
类似,using
声明的也是一个函数指针类型。不过,阅读起来就比较流畅。
using FunctionType = int (*) (char, double);
FunctionType func_ptr = &func; // func同上
注意
typedef和using都是声明的类型,需要定义对象后才能使用。如果只是想要定义一个函数指针对象,不需要加任何关键词。
typedef int (*FunctionType)(char, double); // 声明一个函数指针类型
int (*FunctionType)(char, double); // 定义一个函数指针对象
代码
#include <iostream>
int max(int a, int b) {
return a < b ? b : a;
}
// 利用typedef,声明一个函数指针[类型]
typedef int (*comp_type)(int, int);
// 定义一个函数指针[对象],其指向nullptr
int (*comp_ptr) (int, int) = nullptr;
// c++11的类型别名,与typedef类似,同样声明了一个函数指针[类型]
using comp_using = int (*)(int, int);
int main (int argc, char** argv) {
std::cout << "typedef" << std::endl;
comp_type c_ptr = &max;
std::cout << c_ptr(3, 4) << std::endl;
std::cout << "pointer" << std::endl;
comp_ptr = &max;
std::cout << comp_ptr(3, 4) << std::endl;
std::cout << "using" << std::endl;
comp_using using_ptr = &max;
std::cout << using_ptr(3, 4) << std::endl;
return 0;
}