函数指针与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 <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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值