首页 > 编程语言 >c++ 函数指针

c++ 函数指针

时间:2022-11-15 00:35:00浏览次数:40  
标签:const string int 函数 c++ 函数指针 指针

函数指针是指向函数的指针。指针的类型由它的返回类型和形参类型共同决定。

例如

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

pf指向一个函数,函数的参数是两个string引用,返回值是bool类型。

注意

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

名字的括号必不可少,没有括号的话,这个就是一个返回值为bool指针的函数。

使用函数指针

可以将函数指针=0,让指针不指向任何函数。

使用函数指针可以用指针名字直接调用,也可以先解引用指针。

//两种方式等价
bool b1 = pf ("hello","goodby");
bool b2 = (*pf) ("hello","goodby");

函数指针做函数形参

可以是类似函数类型,会被自动转换为函数指针。也可以显式的定义为函数指针

void useBigger( const string &s1,const string &s2,
                        bool pf(const stirng &, const string &) );

void useBigger( const string &s1,const string &s2,
                        bool (*pf) (const stirng &, const string &) );

传递函数实参的时候,我们也可以直接将函数作为实参使用,此时它会自动转换为指针。

useBiger( s1, s2, lengthCompare) ;

函数指针做返回值

虽然不能返回函数,但我们可以返回函数指针。但是编译器不会进自动转换,必须显式的声明。直接声明的形式如下

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

按照从内向外的顺序阅读,看到 f1后边有形参列表, 因此 f1是一个函数。 f1前边有一个 *,所以f1 返回一个指针;进一步观察,指针类型也包含一个形参列表,因此指针指向一个函数。该函数的返回类型是int 。

再类如

static void (* set_malloc_handler (void (*f) () ) ) ()

{
    //一些代码
}

找到名字set_malloc_handler,后边有形参列表,所以 这是一个函数,形参是一个函数指针,形参的指针返回值为void 。

再往前看,名字前边有一个 * 因此这个函数的返回值也是一个指针,最后边还跟着一个空的形参列表,因此,函数返回的指针也是一个函数指针,这个函数指针的返回值是void。

使用类型别名

我们可以定义自己的类型来使代码简化,清晰。

//下面两种定义等价,Func , Func2是函数类型
typedef bool func (const string &, const string &);
typedef decltype(lengthCompare) Func2;

//定义函数指针
typedef decltype(lengthCompare) Funcp;

也可以使用 using 

//定义类型别名
using F=int (int *,int);
using PF = int (*) (int * ,int);

//使用别名定义函数
PF  f1(int); //正确
F   f1(int);  // 错误,不能转化
F * f1(int);  // 正确

 

标签:const,string,int,函数,c++,函数指针,指针
From: https://www.cnblogs.com/fdbwymz/p/16890976.html

相关文章

  • windwos cmake与c++的使用教程
    1概述欢迎指正......
  • c++基础2
    模板c++另一种编程思想称为泛型编程,主要利用的技术就是模板c++提供两种模板机制:函数模板和类模板函数模板建立一个通用函数,函数的返回值类型和形参类型可以不具体指......
  • C++软件编码规范推荐--Qt相关
    1背景  Qt开发常用于跨平台开发的首选,所以关于Qt开发的编码规范也很重要。2QWidget  【规范】信号命名:sgl+驼峰命名规则,如:sglUpdate();  【规范】槽函数:on+驼峰......
  • C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)
    命名空间概述在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的......
  • c++中尽量用const,enum,inline替换#define
    一般声明在头文件,注意:在class中声明常量通常要加static例:classA {public:staticconstinta=0;} 对于单纯的常量,最好以const或enums替换#define......
  • C++软件编码规范推荐--命名规则
    1.背景  命名规则对于代码开发和理解很重要,是作为一名合格的设计师具备的良好代码习惯。2.命名规则2.1匈牙利命名法  基本原则:变量名=属性+类型+对象描述......
  • 密码学C/C++语言实现学习笔记——基本运算函数
    密码学C/C++语言实现学习笔记——基本运算函数基础数据结构:typedefunsignedshortclint;typedefunsignedlongclintd;书中所使用环境unsignedshort是16位(2......
  • C++软件编码规范推荐--程序的版式
    1.背景  版式虽然不会影响程序的功能,但会影响程序的可读性;追求清晰、直观;2.规范2.1空行  空行起分隔程序段落的作用。合理的空行使布局更清晰,也不会浪费内存; ......
  • C++11中enable_shared_from_this的用法解析
    转载:https://blog.csdn.net/breadheart/article/details/112451022什么是enable_shared_from_this?下面摘自cppreference中概述C++11开始支持enable_shared_from_......
  • C++中sort函数、1.4最长公共子串
    sort()即为用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。sort在实现时避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。使用sort()......