表达式是指能够捕获作用域中的变量的无名函数对象,狭义的理解,就是匿名函数。

无论是在项目中,还是在开源网站,总是能够看到的身影。

为了能够轻松阅读代码,进而熟练地使用,本文首先将讲解表达式的基本语法、三种基本用法,然后介绍五种实际的应用场景,最有总结说明表达式的作用。

用法consider_c++const用法_用法convince

表达式语法

首先看下表达式的基本语法,它由五部分组成,分别为捕捉列表,参数列表,修饰符,返回类型和函数体。

c++const用法_用法convince_用法consider

捕捉列表可以设定当前是值传递方式[=]或者引用传递方式[&], 参数列表则就是函数的参数,返回类型表示函数体执行完成之后返回的类型、比如整型int、布尔型bool等。函数体则是实现实现的功能。另外,由于表达式默认返回是const类型,如果想要取消const属性,那么需要加上修饰符。

基本用法

现在通过三个简单的例子来介绍表达式的用法,加深对其的理解。

第一个例子是函数没有返回值的形式,首先定义四个变量,然后创建表达式ret, 内部直接打印父作用域四个变量的值,注意[=] 表示值传递方式捕捉所有父作用域的对象。

用法consider_c++const用法_用法convince

运行程序输出的结果如下,调用表示式ret()之后,正确的输出了父作用域的所有的值。

c++const用法_用法consider_用法convince

第二个例子是增加函数的返回值,先计算父作用域所有变量的和,作为返回值。

用法consider_c++const用法_用法convince

从运行的结果看,调用匿名函数(), 正确返回了所有父作用域变量值的和

用法consider_c++const用法_用法convince

第三个例子是表达式修改父作用域的值,如果想要修改父作用域的值,那么需要通过引用传递的方式。

用法convince_c++const用法_用法consider

通过引用传递的方式,将父作用域的变量i_b传递给表达式的捕捉列表, 从输出的结果看,父作用域的值被修改了。

用法consider_用法convince_c++const用法

注意,捕捉列表支持传递多个值,各个值之间是通过逗号隔开。

c++const用法_用法convince_用法consider

应用场景

上面只是简单介绍了表达式的使用,接下来将讲解表达式的五种应用场景。

第一种场景是查找功能,首先创建list列表来存储数据,构建的数据内容如下。

c++const用法_用法convince_用法consider

接着调用函数来查找项目,判断逻辑则是通过表达式来实现。这里为了简化,将声明为局部变量,其实,可以把以下功能使用函数来封装,然后作为参数传递。

c++const用法_用法convince_用法consider

第二种场景是打印功能,调用来循环访问向量,表达式作为第三个参数,功能是打印输出向量值。

用法consider_用法convince_c++const用法

第三个场景是线程等待,创建启动线程,线程的功能是使用条件变量等待,判断条件使用表达式来实现,如果队列为空,那么返回false, 条件变量继续等待,如果队列不为空,那么继续往下执行。

用法convince_用法consider_c++const用法

第四种场景作为函数的入参,首先定义函数,入参为函数对象。

c++const用法_用法consider_用法convince

接着创建创建表达式,将其作为参数传递给上面实现的函数。这里运用到开闭原则,只接收参数并执行,具体执行什么内容则由外部传递进来的表达式决定。

用法convince_用法consider_c++const用法

第五种场景删除功能,std::支持三个参数,前两个表示迭代器的起始和结束位置,第三个参数传递的是一个回调函数,如果回调函数返回真,那么表示应该移除。这里回调函数使用了表达式。注意不会真正删除元素,它将不需要移除的元素依次替换掉序列中前面的元素,并返回应移除的第一个元素的迭代器。

如下图的例子中,std::执行完成之后,输出的值是5 6 7 4 5 6 7,即 5 6 7是不需要删除的元素,将其移到1 2 3的位置,并且返回应移除的第一个元素的迭代器,即4的位置。最后使用erase删除元素,你会发现输出的值是5 6 7。

c++const用法_用法consider_用法convince

总结

从上面介绍的表达式的三种用法和五种应用场景看,可能会发现,如果不了解表达式的语法,会觉得深奥难懂,但是梳理清楚之后c++const用法,将会发现它其实不难,并且能够使得代码简洁易读。

会员全站资源免费获取,点击查看会员权益

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注