5分钟搞懂C++函数指针与函数类型

简介: 函数指针和函数类型 函数指针指向的是函数而非对象。和其他指针类型一样,函数指针指向某种特定类型。 函数类型由它的返回值和参数类型决定,与函数名无关。 bool length_compare(const string &, const string &); 上述函数类型是: bool (const.

函数指针和函数类型

函数指针指向的是函数而非对象。和其他指针类型一样,函数指针指向某种特定类型。

函数类型由它的返回值和参数类型决定,与函数名无关。

bool length_compare(const string &, const string &);

上述函数类型是:

bool (const string &, const string &);

上述函数指针pf:

bool (*pf)(const string &, const string &);

使用函数指针

当把函数名作为一个值使用时,该函数自动的转换成指针,如:

pf = length_compare <=>等价于
pf = &length_compare12

函数指针形参

函数类型不能定义为形参,但是形参可以是指向函数的指针;

函数作为实参使用时,会自动的转换成函数指针;

typedef bool Func(const string &, const string &) // Func是函数类型;
typedef bool (*FuncP)(const string &, const string &) // FuncP是函数指针类型;
typedef decltype(length_compare) Func2  // Func2是函数类型;
typedef decltype(length_compare) *Func2P // Func2P是函数指针类型;
注意decltype(length_compare)返回的是函数类型,而不是函数指针类型;

using FTtype = int(int,int); //函数类型
typedef int (*pf)(int, int); //函数指针

int func(int a, int b){return a+b;}
void print(int a, int b, FTtype fn){
    // 编译器将其隐式转化成函数指针
    cout << fn(a,b) << endl;
}

int main()
{
    print(1,2,func);
    cout << typeid(FTtype).name() << endl;
    cout << typeid(func).name() << endl;
    cout << typeid(decltype(func)).name() << endl;
    cout << typeid(pf).name() << endl;
    return 0;
}

下面两个声明语句是同一个函数,因为编译器会自动的将FTtype 转换成函数指针类型。

void print(int a, int b, FTtype  fn);

void print(int a, int b, pf fn);

返回指向函数的指针

虽然不能返回一个函数,但是能返回执行函数类型的指针。和函数参数不同,编译器不会自动地将函数返回类型当作指针类型处理,必须显示的将返回类型指定为指针。如:

using F = int(int*, int);
using PF = int(*)(int*,int);
F  f1(int);    //错误: F是函数类型
PF  f1(int);   //正确: PF是函数指针类型

f1也可以写出下面两种形式:

int (*f1(int))(int*, int);

auto f1(int)->int(*)(int*, int);

作者:guoxiaojie_415

来源:https://blog.csdn.net/guoxiaojie_415/article/details/79921788


原文发布时间为:2018-09-30

原文作者:良许Linux

本文来自云栖社区合作伙伴“良许Linux”,了解相关信息可以关注“良许Linux”。

相关文章
|
15天前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
|
15天前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
|
15天前
|
存储 C语言
指针的函数传参的详细讲解(一)
本文介绍了计算机内存管理与C语言中指针的基本概念及应用。从内存单元的划分到指针的定义,解释了指针作为地址的作用及其数据类型特性。文章通过代码示例详细说明了一级指针、二级指针的使用方法,以及`void*`指针的特点和限制。此外,还探讨了指针运算规则、函数指针传参解引用的原理,并结合链表实例分析了一级与二级指针在实际场景中的区别。最后附带两道指针练习题,帮助读者巩固理解。
|
3月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
208 6
|
6月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
208 1
|
7月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
172 4
|
7月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
470 4
|
8月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
8月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
8月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。