#学习自用#
函数指针
原始函数指针
原始函数指针来自C语言,函数的函数名就是一个原始函数指针,它代表的是函数所在的地址。
#include<iostream>
#include<string>
using namespace std;
void HelloWorld(int i)
{
cout << "hello world!" << endl;
}
int main()
{
void(* func1)(int) = HelloWorld;
func1(1);
auto func2 = HelloWorld;
func2(2);
cin.get();
}
函数指针就是函数的指针,首先它是指针所以要具有指针的形式 * func1(func1是变量名),其次要有函数的形式,且类型要相同所以有 void( )(int)。使用auto接收,书写比较简单。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void print(int a)
{
cout << a << endl;
}
void foreach(const vector<int>& A,void(* P_func)(int))
{
for (int a : A)
P_func(a);
}
int main()
{
vector<int> A = { 1,5,3,2,4 };
foreach(A,print);
cin.get();
}
上面这串代码主要是想介绍一下for(int a:A)这条语句,在每次循环中,将容器 A 中的元素赋值给变量 a。它用于遍历容器中的元素,普通的数组无法使用这条语句。
lambda表达式
lambda 表达式是一种定义匿名函数的方式,这种函数是一次性的。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void foreach(const vector<int>& A, void(*P_func)(int))
{
for (int a : A)
P_func(a);
}
int main()
{
vector<int> A = { 1,5,3,2,4 };
foreach(A, [](int value) {cout << value << endl; });
cin.get();
}
这串代码与之前的代码功能相同,只是print函数,我们使用lambda表达式简化了。
[](int value) {cout << value << endl; } ,这里定义了我们的lambda函数,void(*P_func)(int) 这个函数指针限定了我们的lambda要写成什么样子(void类型,所以lambda中没有返回值;传参类型为int,所以lambda参数列表有int value)
[]中括号内的内容是捕获,可以不捕获任何东西,也可以捕获多个,捕获就是传入函数外部的变量,假如我们在main函数中定义了一个int i=0;我们如何把i传入lambda中,首先,lambda是在P_func(a)这里被调用的,所以可以先把 i 传入 foreach,再传入P_func,对应的要改变参数列表。或者我们直接捕获i [i],这样书写后foreach的参数列表需要修改一下,因为非捕获lambda可以隐式转换成函数指针,而有捕获的不行,所以不能用void(*P_func)(int)接收。这里接收的形参涉及头文件#include<functional> 暂时还没学,留作补充。