新闻详情

新闻详情

首页 / 资讯中心 / 详情

【C++进阶】C++ 11(下)

发布时间:2026/10/1 21:33:12来源:尧图网络
【C++进阶】C++ 11(下)
目录1 可变参数模板2 emplace 系列接口3 C11 类新语法default、delete4 lambda 表达式捕获规则5 std::function 包装器6 std::bind 适配器小结1 可变参数模板C11 支持可变参数模板使用...代表参数包。分为模板参数包、函数参数包。templateclass ...Args void Print(Args... args) { cout sizeof...(args) endl; // sizeof... 获取参数包中参数个数 }Args...模板参数包args...函数参数包。sizeof...(args)编译期拿到参数包里面参数总个数。参数包不能用 for 循环遍历只能通过编译期递归展开。递归展开示例#includeiostream #includestring using namespace std; //递归终止参数包为空 void ShowList() { cout endl; } templateclass T, class ...Args void ShowList(T x, Args... args) { cout x ; ShowList(args...); // 剥掉第一个参数剩下继续递归 } templateclass ...Args void Print(Args... args) { ShowList(args...); } int main() { Print(); Print(1); Print(1, string(hello)); Print(1.1, 2, abc); return 0; }原理编译阶段实例化出多份重载函数不是运行时解析参数。2 emplace 系列接口容器新增emplace_back / emplace接收可变参数包。push_back需要已经构造完成对象再拷贝 / 移动进入容器emplace_back(Args... args)直接在容器结点内存上构造对象不需要生成临时对象。底层可变参数包 完美转发std::forwardArgs(args)...把参数转发给结点的构造函数。示例 list 模拟结点templateclass T struct ListNode { T _data; ListNodeT* _prev; ListNodeT* _next; //支持可变参数直接构造data templateclass... Args ListNode(Args... args) :_data(std::forwardArgs(args)...) {} };调用示例listpairstring,int lt; lt.emplace_back(苹果,1); //直接传给pair构造不用手动构造pair临时对象3 C11 类新语法default、deleteC98 类 6 个默认成员构造函数拷贝构造拷贝赋值重载析构函数取地址operatorconst 取地址operatorC11 新增两个默认成员函数移动构造、移动赋值。规则没有自己写析构、拷贝构造、拷贝赋值编译器才会自动生成默认移动构造 / 移动赋值。default强制让编译器生成默认版本函数。delete删除函数禁止调用该函数C98 时代把函数放 private 实现同样效果。示例class Person { public: Person(const char* name , int age 0){} Person(const Person p){} Person(Person p) default; //强制生成默认移动构造 Person operator(Person p) default; Person operator(const Person p) delete; //删除拷贝赋值禁止使用 };另外 C11 支持类内成员变量直接初始化缺省值给初始化列表提供默认值。4 lambda 表达式lambda 本质编译器自动生成匿名仿函数类。 完整语法[捕获列表](参数列表) - 返回类型 {函数体};[]捕获列表不可省略()参数列表无参数可以省略-返回类型追踪返回类型可以省略编译器自动推导{}函数体不可省略。捕获规则表格写法含义[x]值捕获拷贝一份默认 const不能修改[x]引用捕获直接使用外部变量本体可以修改[]隐式值捕获用到的变量全部值捕获[]隐式引用捕获用到的变量全部引用捕获[, a]其它值捕获a 引用捕获[, a]其它引用捕获a 值捕获mutable加在参数括号后面取消值捕获变量的 const 属性可以修改拷贝副本不会影响外部实参。全局变量、静态局部变量不需要捕获可以直接使用lambda 写在全局域捕获列表必须为空。#includeiostream #includevector #includealgorithm #includestring using namespace std; struct Goods { string _name; double _price; int _evaluate; Goods(const char* str, double price, int evaluate) :_name(str),_price(price),_evaluate(evaluate) {} }; int main() { vectorGoods v { {苹果, 2.1, 5}, {香蕉,3,4},{橙子,2.2,3},{菠萝,1.5,4} }; sort(v.begin(),v.end(),[](const Goods g1,const Goods g2){ return g1._price g2._price; }); return 0; }lambda 底层原理编译器生成一个仿函数类捕获的变量变成类的成员调用 lambda 等价调用仿函数operator()。5 std::function 包装器头文件functional。std::functionRet(Args...)统一包装各类可调用对象普通函数、函数指针、仿函数、lambda 表达式、bind 返回对象。 解决不同可调用对象类型不一样无法统一保存的问题。 如果function对象没有包装目标调用会抛出bad_function_call异常。#includefunctional #includeiostream using namespace std; int f(int a,int b) { return ab; } struct Functor { int operator()(int a,int b) { return ab; } }; int main() { functionint(int,int) f1 f; functionint(int,int) f2 Functor(); functionint(int,int) f3 [](int a,int b){return ab;}; cout f1(1,2) endl; cout f2(1,2) endl; cout f3(1,2) endl; return 0; }6 std::bind 适配器头文件functionalbind 是函数适配器包装可调用对象可以绑定固定参数调整参数顺序 占位符_1 _2 _3定义在std::placeholders命名空间。#includefunctional #includeiostream using namespace std; using placeholders::_1; using placeholders::_2; int Sub(int a,int b) { return (a-b)*10; } int main() { auto sub1 bind(Sub,_1,_2); cout sub1(10,5) endl; auto sub2 bind(Sub,_2,_1); //交换参数顺序 cout sub2(10,5) endl; auto sub3 bind(Sub,100,_1); //第一个参数固定100 cout sub3(5) endl; return 0; }小结可变参数模板依靠编译递归展开参数包sizeof...(args)拿到参数数量emplace依靠可变参数 完美转发直接在容器内存构造对象。default强制生成编译器默认函数delete删除函数禁止调用。C11 新增移动构造、移动赋值两个默认成员。lambda 是编译器生成匿名仿函数掌握捕获列表、mutable适合算法 sort 等场景写临时逻辑。std::function统一包装不同类型可调用对象std::bind做参数绑定、顺序调整适配器。后续 C11 其余特性智能指针、unordered 哈希容器、范围 for、override/final、string_view 等属于其他章节。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

植物叶片病害检测数据集:10类别YOLO格式解析与训练实战 2026/10/1 22:38:55

植物叶片病害检测数据集:10类别YOLO格式解析与训练实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
实施工程师面试高频题与答题逻辑:SQL、项目推动、客户沟通全解析 2026/10/1 22:38:55

实施工程师面试高频题与答题逻辑:SQL、项目推动、客户沟通全解析

最近老有朋友找我聊跳槽的事,聊来聊去发现大家都卡在同一个环节:面试。尤其是做实施工程师的朋友,普遍觉得“活儿能干,但面试不会说”。其实实施面试题没有想象中那么玄乎,它不像开发岗那样死磕算法,也不像…

阅读更多 →
解决IntelliJ IDEA Maven项目“程序包不存在”报错:排查与实战指南 2026/10/1 22:38:55

解决IntelliJ IDEA Maven项目“程序包不存在”报错:排查与实战指南

“程序包xxx.xxx.xx不存在”这个报错,几乎每个用 IntelliJ IDEA 做 Maven 项目的开发者都撞到过。它出现得毫无预兆:昨天代码还好好的,今天一打包就崩,看着满屏红字完全摸不着头脑。我在做 Java Web 项目的几年里,被这…

阅读更多 →
Oracle替换工程实践:从资产盘点、SQL改造到割接踩坑全解析 2026/10/1 22:38:54

Oracle替换工程实践:从资产盘点、SQL改造到割接踩坑全解析

接手过Oracle替换工程的人都知道,真正难的从来不是"把数据倒过去",而是"让整个系统无感地搬过去"。刚接到任务时,你面对的往往是一个运行多年的Oracle库,后面挂着一堆应用、报表、定时任务、存储过程&#xf…

阅读更多 →
生成式AI如何辅助虚幻引擎5.9渲染通道:原理、实战与排错指南 2026/10/1 22:38:46

生成式AI如何辅助虚幻引擎5.9渲染通道:原理、实战与排错指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于 Rube MCP 的 Esignatures IO 自动化实践指南——来自 awesome-claude-skills 的 Composio 工作流技能解析 2026/10/1 22:38:46

基于 Rube MCP 的 Esignatures IO 自动化实践指南——来自 awesome-claude-skills 的 Composio 工作流技能解析

AI 技能AI 插件人工智能工作流自动化 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-claude-skills 点击…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉