函数指针与typedef和using的类型声明

函数指针与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 

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;
}

你可能感兴趣的:(c++,visual,studio,c语言,数据类型)