C++之函数指针
来源:互联网 发布:java 国家精品课程 编辑:程序博客网 时间:2024/05/18 17:59
1、函数指针相关概念
1)定义:指向函数的指针。和其他指针一样,函数指针也是指向某个特定的类型。函数类型由其返回类型以及形参表确定,与函数名无关。
2)声明:
bool (*pf) (const string &, const string &);
上例将pf声明为指向函数的指针,它所指向的函数带有两个const string&类型的形参和bool类型的返回值。
就像int a;声明了一个int型变量a,但是并没有给变量a赋值。上例声明了一个指向返回bool类型并带有两个const string&类型的形参的函数的指针,但并没有具体指向哪个函数。
注意:*pf两侧的括号是必须要的,否则:
bool *pf (const string&, const string&);//声明了一个bool*的函数
2、用typedef简化函数指针的定义
函数指针类型的声明特别冗长。使用typedef为指针类型定义同义词,可使函数指针的使用大大简化:
typedef bool (*cmpFcn)(const string&, const string&);该定义表示cmpFcn是一种指向函数的指针类型的名字。在使用这种函数指针类型时,只需直接使用cmpFcn即可,不必每次都把整个类型声明全部写出来。
3、指向函数的指针的初始化和赋值
在引用一个函数的名字,但是又没有调用该函数时,函数名将自动被解析为指向函数的指针,假设有函数:
bool lengthCompare(const string&, const string&);对函数名lengthCompare的使用将被解释为如下类型的指针:
bool (*)(const string&, const string&);可使用函数名对函数指针做初始化或赋值:
cmpFcn pf1 = 0;cmpFcn pf2 = lengthCompare;pf1 = lengthCompare;//等价于pf1 = &lengthCompare;直接引用函数名等效于在函数名上应用取地址操作符pf2 = pf1;
函数指针只能通过同类型的函数、函数指针或0值常量表达式进行初始化和赋值。
将函数指针初始化为0,表示该指针不指向任何函数。
指向不同函数类型的指针之间不存在转换。
string :: size_type sumLength(const string&, const string&);bool cstringCompare(char *, char *);cmpFcn pf;pf = sumLength;//❌ return type differspf = cstringCompare;//❌ parameter type differspf = lengthCompare;//✅ function and pointer types match exactly
4、通过指针调用函数
指向函数的指针可以调用它所指向的函数。
cmpFcn pf = lengthCompare;lengthCompare("hi", "bye");//直接调用pf("hi", "bye");//通过函数指针隐式调用(*pf)("hi","bye");//通过函数指针显式调用如果指向函数的指针没有初始化,或者具有0值,则该指针不能在函数调用中使用,只有当指针已经初始化,或被赋值为指向某个函数,方能安全的调用函数。
5、函数指针形参
函数的形参可以是指向函数的指针。这种形参可以用以下两种形式编写:
void fun(const string &, const string &, bool(const string &, const string &) );void fun( const string &, const string &, bool(*)(const string &, const string &));
0 0
- C-[之函数指针]
- c语言之函数指针
- C常见问题之函数指针
- C/C++之函数指针
- C语言之函数指针
- C语言之函数指针
- C语言之函数指针
- C语言之指针函数
- c/c++之函数指针
- Linux C之函数指针
- C学习之------C函数指针
- c语言学习笔记之函数指针和指针函数
- C/C++ 之 指针函数 和 函数指针
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- 基本数据类型和引用数据类型
- JAVA 3DES加密/解密
- Swagger与SpringMVC项目整合
- Google Gson的使用方法及JSON 技术对比
- JAVA性能优化:35个小细节让你提升java代码的运行效率
- C++之函数指针
- MyBatis Eclipse插件安装
- redis教程(一)之redis简介
- redis教程(二)之VMvare安装
- redis教程(三)之redis安装
- redis教程(四)之redis启动服务与连接
- redis教程(五)之redis数据类型
- redis教程(六)之redis String
- redis教程(七)之redis List