锦州网站建设动态app开发制作定制外包26
2026/2/22 13:04:14 网站建设 项目流程
锦州网站建设动态,app开发制作定制外包26,外吐司做的阿里巴巴的网站,赣州章贡区二手房出售信息关注我#xff0c;学习c不迷路: 个人主页#xff1a;爱装代码的小瓶子 专栏如下#xff1a; c学习Linux学习 后续会更新更多有趣的小知识#xff0c;关注我带你遨游知识世界 期待你的关注。 文章目录1. c11的介绍#xff1a;2. {}初始化#xff1a;2-1#xff1a; 避…关注我学习c不迷路:个人主页爱装代码的小瓶子专栏如下c学习Linux学习后续会更新更多有趣的小知识关注我带你遨游知识世界期待你的关注。文章目录1. c11的介绍2. {}初始化2-1 避免歧义和窄化转换问题2-2 统一的样式进行初始化2-3 对比两种初始化2-4 陷阱3. 为什么要做到统一初始化1. **降低学习成本**2. **提高代码可读性和一致性**3. **与现代C理念一致**总结1. c11的介绍C11是C历史上一次里程碑式的更新它为这门古老而强大的语言注入了新的活力。在C11之前我们习惯了繁琐的构造函数调用、复杂的初始化语法以及在传递临时对象时的性能损耗。但C11的到来彻底改变了这一切。想象一下你可以用统一的{}语法初始化任何类型——从内置类型到自定义类从数组到容器代码变得更加简洁优雅。更令人兴奋的是C11引入了右值引用和移动语义让编译器能够偷走临时对象的资源避免不必要的拷贝从而大幅提升程序性能。本文将带你深入探索C11的这两个核心特性首先是列表初始化统一初始化它让C的初始化语法大一统然后是右值引用与移动语义这是C11性能优化的利器。无论你是C新手还是资深开发者这些特性都将让你的代码更现代、更高效。2.{}初始化在c11没有出来之前我们初始化无法做到统一而前复杂还很麻烦我们还发现我们还可以这样初始化最后一个a3这个变量明显是错误的这又他的精度会明显变小于此同时在初始化STL容器的时候很麻烦我们需要一个一个的进行插入。或者在自定义变量中初始化也是很麻烦的事情。总之初始化变量这个事情可谓是八仙过海各显神通。// C11之前容器初始化很繁琐std::vectorintv1;v1.push_back(1);v1.push_back(2);v1.push_back(3);std::vectorintv2(5,1);// 5个元素都是1std::vectorintv3(5);// 5个默认初始化的元素// 对于map更麻烦std::mapint,std::stringm;m[1]one;m[2]two;在引入c11后2-1 避免歧义和窄化转换问题原来的精度问题得到有效解决原本的警告直接变成error这一点在编译器中我们也可以看到{}初始化会禁止窄化转换让代码更安全。2-2 统一的样式进行初始化无论你是STL的vector还是map或者set还是自定义类型Data或者student我们都可以尝试使用{}来进行初始化intx{1};doubley{1.2};vectorintv({1,2,3,4,5,6});vectorintv2{1,2,3,4,5,6};mapstring,intmp{{1111,1},{2222,2}};这样看起来很是美观这里是怎么做到的呢这里其实引入了initializer_list。这是一个轻量级的容器// initializer_list是C11引入的轻量级代理对象namespacestd{templatetypenameTclassinitializer_list{private:constT*array;// 指向数组的指针size_t len;// 元素个数public:// 构造函数等};}我们拿vector中拿来作比较我们在{}里面的数字先构成了initializer_list随后调用vector的构造函数完成来构造templatetypenameTclassvector{public:// 1. 默认构造vector();// 2. 指定大小和值vector(size_t n,constTvalue);// 3. 迭代器范围templatetypenameInputItvector(InputIt first,InputIt last);// 4. initializer_list构造C11新增vector(std::initializer_listTinit);// 5. 拷贝/移动构造vector(constvectorother);vector(vectorother);};在这里我们可以看到很多构造函数。c中总是调用自己最合适的函数我们{}里面的变量已经构成了initializer_list我们便可以调用4号来进行完成构造。总结编译器背后做了什么创建临时数组在栈上创建int[5] {1, 2, 3, 4, 5}。创建initializer_liststd::initializer_listint il(临时数组[0], 5)。调用匹配的构造函数vector(il)拷贝或移动这些元素到vector内部。再来说说map是怎么初始化的templatetypenameKey,typenameValueclassmap{public:// 接受pair的initializer_listmap(std::initializer_liststd::pairconstKey,Valueinit);};std::mapint,std::stringm{{1,one},{2,two}};外层{}识别为initializer_list的参数内层{1, “one”}解析为std::pairint, std::string的初始化pair的构造std::pairconst int, std::string(1, “one”)最终调用map({pair1, pair2})2-3 对比两种初始化我们来尝试多组对比vectorintv(8,2);vectorintv1{1,2,3,4,5,6,7,8};vectorintv2{1,2,3,4,5,6,7,8};vectorintv3({1,2,3,4,5,6,7,8});这几个初始化有什么区别呢第一个是传统的c初始化全部初始化成2。只有在特定的情况下使用。第二个则是c11初始化的标准,我们会调用vector(std::initializer_listint init)创建 8个元素值分别为1到8。最推荐的现代C写法。第三个很像是拷贝列表初始化在现代编译器中几乎和第二个相同更像是赋值拷贝初始化。适用场景v2更像赋值语义v1更像构造语义。第四个过于冗余了显式创建一个initializer_listint临时对象调用构造函数vector(std::initializer_listint init)多此一举但语法合法。初始化方式调用构造函数创建元素数量元素值推荐度v(8, 2)vector(size_t, const T)8个全是2⭐⭐⭐特定场景v1{1,2,3,4,5,6,7,8}vector(initializer_listT)8个1-8⭐⭐⭐⭐⭐v2 {1,2,3,4,5,6,7,8}vector(initializer_listT)8个1-8⭐⭐⭐⭐v3({1,2,3,4,5,6,7,8})vector(initializer_listT)8个1-8⭐⭐2-4 陷阱classWidget{public:Widget(inta,intb){}Widget(std::initializer_listintlist){}};Widgetw1(1,2);// 调用第一个构造函数Widget w2{1,2};// 调用第二个构造函数initializer_listWidgetw3(1,2,3);// 错误Widget w4{1,2,3};// 调用第二个构造函数在这段函数中总是调用最合适自己的那么第一个就会调用第一个构造函数第二个由于大括号会调用第二个构造函数。第三个由于无法匹配导致错误。classMyClass{inta;std::string b;public:// 1. initializer_list构造不常用MyClass(std::initializer_listintlist){// 不推荐类型不匹配}// 2. 多参数构造推荐MyClass(inta,std::string b):a(a),b(b){}// 3. 聚合类型最简单// 去掉构造函数让struct成为聚合类型};// 使用MyClass obj{1,hello};// 调用构造函数 #23. 为什么要做到统一初始化1.降低学习成本旧的C需要掌握多种初始化方式int x 0;赋值int x(0);直接初始化int arr[] {1,2,3};聚合初始化std::vectorint v(10, 1);括号初始化新的C一种方式搞定所有int x{0};int arr[]{1,2,3};std::vectorint v{10, 1};2.提高代码可读性和一致性// 以前不同容器、不同类型的初始化语法不一致inta1;intb(2);intc[]{3,4};std::vectorintv(5,1);// 括号std::mapint,intm{{1,2},{3,4}};// 双括号// 现在统一用{}一眼就能看懂inta{1};intb{2};intc[]{3,4};std::vectorintv{5,1};// 注意这里含义不同了std::mapint,intm{{1,2},{3,4}};3.与现代C理念一致C11开始C致力于更安全类型安全、转换安全更简洁语法统一更现代符合现代编程语言趋势C98/03的初始化语法是拼凑出来的不同场景用不同语法。统一初始化让C从方言走向标准语。统一初始化为后续C11/14/17/20的很多新特性提供了基础比如结构化绑定模板参数推导聚合初始化扩展总结统一初始化{}的核心价值安全防止意外的类型转换统一一种语法多种场景简洁减少记忆负担现代让C更符合现代语言标准正如C之父Bjarne Stroustrup所说“我希望C能有一种统一的初始化方式让初始化不再令人困惑。”{}就是这个愿景的实现。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询