
【C/C++基础进阶系列】C/C++ 基础知识 -- C++ 面向过程新特性与关键知识点总结(二)
发布日期:2021-05-07 20:53:13
浏览次数:46
分类:精选文章
本文共 1578 字,大约阅读时间需要 5 分钟。
【C/C++基础进阶系列】C++ 面向过程新特性与关键知识点总结(二)
【1】可调用对象、std::function、std::bind
可调用对象
可调用对象是指可以像函数一样被调用(即支持operator()运算符)的对象。只要一个对象所属的类定义了operator()成员函数,该对象便成为了可调用对象。类似于函数调用,类对象通过operator()可以接收参数并执行相应的操作。
std::function与std::bind
- std::function:是一个通用的可调用对象包装器,能够包装各种类型的可调用对象(如函数、仿函数、成员函数指针等)。
- std::bind:一个绑定器,用于将参数和可调用对象绑定在一起。通过std::bind,可以将一个可调用对象与特定的参数结合起来,形成一个新的可调用对象。
例如:
// 绑定一个普通函数std::functionf1 = std::bind(myfunc, 10, 20, 30);f1(); // 调用myfunc函数// 绑定一个类的静态成员函数std::function fs2 = std::bind(TC::stcfunc, 110);fs2(); // 调用TC::stcfunc静态成员函数// 绑定仿函数TC tc3;std::function f3 = std::bind(tc3, 120);f3(); // 调用TC::operator()函数
类成员函数指针
类成员函数指针用于在类的外部定义成员函数,并在类对象上进行调用。例如:
TC tc;void (TC::*myfpointpt)(int) = &TC::ptfunc;(tc.*myfpointpt)(68); // 调用TC::ptfunc成员函数
【2】lambda表达式
lambda表达式是C++11新特性,允许在代码中定义匿名函数。lambda具有以下特点:
捕获列表:
[this]
:捕获当前类的this指针。[x, y]
:按值捕获变量,不能修改。[: &y]
:按引用捕获变量,能修改。[=]
:按值捕获所有外部变量。[&]
:按引用捕获所有外部变量。
lambda表达式的定义方式:
// 没有参数的lambdaauto f1 = []() { return 1; };auto f2 = [] { return 2; };// 有参数的lambdaauto f3 = [](int a, int b) { return a + b; };// 参数默认值auto f4 = [](int a = 8) { return a + 1; };// 延迟调用auto f5 = [x, &y](int tv) { y = tv; x = tv; };
lambda表达式的使用场景:
// for_each中的lambdastd::for_each(myvector.begin(), myvector.end(), [&sum](int val) { sum += val; });// find_if中的lambdaauto result = std::find_if(myvector.begin(), myvector.end(), [](int val) { return val > 15; });
lambda表达式的注意事项:
- lambda表达式的捕获列表为空时,表示不捕获任何外部变量。
- lambda表达式中的mutable关键字允许修改捕获的变量。
参考致谢
本文内容参考了《C++新经典》和《C++11/14 高级编程 Boost 程序库探秘》等专业书籍,感谢这些资料对我的学习有所帮助。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月19日 14时53分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09