C++ Primer 6.7函数指针 知识点+练习题 第六章完结!!!

发布时间:2024年01月22日

总思维导图

声明函数指针

bool (*pf)(const string &s1,const string &s2);//pf指向一个函数,该函数返回值是bool类型,形参是两个const string类型的引用
//以上是声明,未初始化
//一定要写括号!!!不写含义就变成声明一个叫pf的函数,返回值是bool*类型
pf=lengthCompare;//赋值

包含显式初始化的声明即定义。

函数指针的使用

把函数名作为一个值使用时,该函数自动转为指针

pf=lengthCompare;//pf指向名为lengthCompare的函数
pf=&lengthCompare;//和上面语句等价
使用指针就相当于使用函数,无需使用*
bool b1=pf("hello","goodbye");
bool b2=(*pf)("hello","goodbye");
bool b3=lengthCompare("hello","goodbye");
//三者都是对的等价
pf不能指向不匹配的函数,但是可以指向0或nullptr,表示该指针没有指向任何一个函数
pf=0;//正确

重载函数指针

void ff(int *);
void ff(unsigned int);//两个重载函数

void(*pf1)(unsigned int)==ff;//!!!根据形参最佳匹配,匹配到第二行的ff
必须精确匹配,有匹配不上的就无法匹配,编译器报错

函数指针做形参

形参看起来是函数类型,实际上却是当成指针来用,自动转换成指向函数的指针

void useBigger(const string&s1,const string& s2,bool pf(const string &,const string &));//第三个参数自动转换为函数指针
void useBigger(const string&s1,const string& s2,bool (*pf)(const string &,const string &));//显式地将形参定义成函数指针
调用时直接传递函数,把函数作为实参即可
useBigger(s1,s2,lengthCompare);

可用类型别名和decltype简化代码

//简化函数类型
typedef bool Func(const string &s1,const string &s2);
typedef decltype(lengthCompare) Func2;
//简化函数指针类型
typedef bool(*FuncP)(const string &s1,const string &s2);
typedef decltype(lengthCompare) *FuncP2;//!!!decltype推测函数类型,不会自己转换为函数指针,要加上*
简化后调用
void useBigger(const string&s1,const string& s2,Func);//自动转换为函数指针Func是简化的函数类型
void useBigger(const string&s1,const string& s2,FuncP2);//函数指针类型显式

函数指针做返回值

使用类型别名返回函数指针

using F=int(int *,int);//F是函数类型
using PF=int(*)(int *,int);//PF是函数指针类型
PF f1(int);//f1返回函数类型
F f1(int);//错误,不能返回函数类型
F* f1(int);//正确,显式地指定返回类型是函数指针

直接声明返回类型

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

尾置返回类型

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

auto和decltype用于函数指针

要注意decltype不会自动转换为指针,需要我们显式加上*

练习题

6.56

#include<iostream>
#include<vector>

using namespace std;

int f1(int a,int b)
{
		return a+b;
}
int f2(int a,int b)
{
		return a-b;
}
int f3(int a,int b)
{
		return a*b;
}
int f4(int a,int b)
{
		return a/b;
}
int f(int,int);
int main()
{
    vector<decltype(f)*> v;
	//vector<int(*)(int,int)>v; 这种写法也对,但没有用decltype更好理解
	v={f1,f2,f3,f4};
	for(auto fp:v)
	{
		cout<<fp(20,5)<<endl;
	}
}
	

疑问

  1. 定义与声明的区别,赋值与初始化的区别
文章来源:https://blog.csdn.net/2301_81198610/article/details/135742940
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。