每日一言
别怕走弯路,每条路上都藏着意想不到的宝藏。
- 流程控制if else 、 switch
- 循环 for 、 while 、 do-while
- 跳转语句 break 、 continue、 goto
- 函数
- 内联函数
以上的直接不用讲了,个别讲,因为不讲的和c语言一模一样
- for循环 我们c语言for循环一般条件是这样写的
比如
int i;
for(i=0;i<5;i++){}
C++是这样写的
for(int i=0;i<5;i++){}
可以看出来c++是允许变量直接定义在for的条件框里面的,C99之前c语言的需要定义在外面,C99之后才可以定义在里面
- goto这个跳转语句的话都不建议用,因为代码不易维护和调试,阅读性比较低,有可能会被主管骂
- 内联函数,这个是C++特有的,有个标识符inline
比如 inline int min(int x,int y){
return x>y?x:y;
}
怎么说呢,这个函数有好有坏,使用的时候需要多注意,因为这个函数的特性是减小开销,就比如我们调用一个函数是有开销的,比如函数的开栈,栈操作,参数的传递都是开销,会增大程序的开销
开销是什么意思呢?又学到了
开销就是,其他资源开销(cpu占用等等),时间开销,内存开销
所以这个函数的定义就是可以实现减小开销的作用,但是在一些复杂的项目和递归函数的时候不能定义成内联函数,因为会减少性能,我们只能在一些简单的函数,且多调用的函数我们进行定义成内联函数,才合理,所以要考虑清楚
Lambda表达式
为什么要用Lambda表达式:
Lambda 表达式是现代编程语言(如 C++、Python、Java、JavaScript 等)中广泛支持的特性,它允许你在需要函数的地方直接定义匿名函数,无需显式命名。以下是使用 lambda 表达式的核心动机和优势:
1. 代码简洁性
问题:传统函数定义需要在代码中单独声明函数,对于简单功能会增加代码冗余。
书写格式:
[capture clause](parameters) -> return_type {
// 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
}
案例1:
我们将add这个函数转换为lambda表达式,但是由于lambda表达式一般与回调函数是绝佳搭档,所以我们这边也不能调用,因此我们如果需要调用lambda表达式的话就需要自行 显式的给一个名字和前面加auto,这样我们才可以进行调用,但是实际上
[](int a,int b)->int{
return a+b;
};
这样就算做完了,一个合格的lambda表达式
案例2:获取最大值
这个就是回调函数
回调函数(Callback Function)是编程中一种重要的设计模式,其核心思想是 “将函数作为参数传递给其他函数,并在特定事件或条件满足时被调用”。
就是当函数被调用的时候函数的参数有一个为函数的情况下,那么这个参数可以被写成lambda表达式
就像这边的compare函数,就可以转换为lambda表达式
这个程序是怎么运行的??我讲解一下
getMax函数进来,这填写50和300两个数,传入compare函数,因为我们的getMax函数的第三个参数是函数指针,所以compare此时虽然表面上是函数名,实际上是将函数的地址传给了getMax,那么getMax的实现就会通过compare的地址找到compare的函数体进行操作,因为getMax的pcompare是指针变量,cpu执行到if(pcompare)的时候就会根据pcompare这个指针变量被赋予的值,这个值就是compare的地址,那么cpu就会通过这个地址去找到compare函数,然后根据compare的代码进行操作,然后返回,
如果a>b 那么就返回true 否则返回false,对应着我们getMax的实现体,true则最大值为a,false则b是最大值
然后我们可以将compare函数写成lambda表达式
Lambda的对参数列表的捕获讲解
很好理解 第一种捕获[x,y]这个写法是直接将x和y捕获 ,捕获就是把x和y的值拿过来用,但是不能修改,也就是我们可以不用在auto add = [](int a,int b)->int{};在参数括号这边写了,我们直接用捕获就可以实现了,所以这两种写法都要会,都要了解是什么意思
第二种是捕获是[=]这个就是将所有的外部变量都捕获,可以不用一个一个写,要是有这个需求的时候可以这样写,但是也是不能修改,也只是获取值而已
第三种捕获是[&],这个可以修改值,像上面案例图片里面这样修改,而且就很像地址一样,可以去修改值,可以选择x修改,如果不修改比如y的话的那么久按照外部变量的值来计算
这个可以去了解一下,面试可能会问,我只能说这两个一点关系都没有
好了基本上C++的lambda表达式就讲解完了
现在我们来做一个小练习来巩固一下Lambda表达式
我要解释一下,我们这个程序是这样设计的,我们是想要设计成加减乘除,做一个计算器的功能
当然我们要知道lambda表达式用于回调函数是绝佳搭档,因为我们不能老是将lambda表达式给显式的取个名字 就像上面auto add 这样就不规范了,因为属于还是调用了函数,没有用上lambda表达式的特性,所以我们需要在调用的时候将lambda表达式,放在回调函数的函数指针的位置,作为参数,那么之前我们写的普通的函数和普通函数转换成了lambda表达式的代码都可以注释掉了,代码就不解释了,因为大家都会看得懂,看不懂的就去回顾知识点