C++学习(20)

#学习自用#

函数指针

原始函数指针

原始函数指针来自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> 暂时还没学,留作补充。

相关推荐

  1. C++学习20

    2024-06-14 19:28:03       29 阅读
  2. c++20】CPP-20-STL-Cookbook 学习笔记

    2024-06-14 19:28:03       41 阅读
  3. C++学习21

    2024-06-14 19:28:03       40 阅读
  4. <span style='color:red;'>c</span>++<span style='color:red;'>20</span>

    c++20

    2024-06-14 19:28:03      46 阅读
  5. C++20设计模式》学习笔记---原型模式

    2024-06-14 19:28:03       53 阅读
  6. C++20设计模式》学习笔记---单例模式

    2024-06-14 19:28:03       41 阅读
  7. C++20设计模式》---原型模式学习笔记代码

    2024-06-14 19:28:03       51 阅读
  8. C++20设计模式》---桥接模式学习笔记

    2024-06-14 19:28:03       76 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 19:28:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 19:28:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 19:28:03       87 阅读
  4. Python语言-面向对象

    2024-06-14 19:28:03       96 阅读

热门阅读

  1. 第壹章第15节 C#和TS语言对比-泛型

    2024-06-14 19:28:03       23 阅读
  2. C++的算法:Kosaraju算法与Tarjan算法

    2024-06-14 19:28:03       29 阅读
  3. 模拟面试题卷一

    2024-06-14 19:28:03       34 阅读