一些无聊的沙雕, 天天问我Cpp11的新特性是什么,用过没有。我说:没有!
1. long long类型(8字节)
1.1 auto(类型推导关键字):我不解释这个了,反向推导过程。
1.2 decltype(表达式推导关键字)这个关键字的存在,可能是为了某些标准模板库开发而存在。演示一下:(模板好像一直以来是一个残缺品,而这个关键字的存在,正好解决了模板类型的问题。所以这个关键字的存在,是为了人家标准模板库而存在。颇有一种时光倒退,把简单的变复杂,可能这就是标准会,“复杂也是一种美”。所以我们这开发者,就不用瞎意淫乱想了,“为你着想,为了更好”。认清现实,不要瞎做梦了。人根本没为你想过)
下面有些注意事项:已经写挺好了。使用的时候注意下,我懒的巧了。
2.列表初始化(Initialized_list) 其实就是大阔号“{}”, 下面看下测试和简单的使用:
ta可以这样 int num = { 100 };
这样 int num1{ 10 };
这样 int num2(1);
都没问题。
这是对于变量来说,再看看其他的。也因为这个,所有模板库,都做了Initialized_list的实现。Initialized_list本身也是标准模板库类型,而模板库实现,必须要提供迭代器方法。当你显示调用,静态初始化时用到"{}"就是Initialized_list)了。这个只是你以前不知道(多久以前?11年以前)其实一直在用。(后期还有很多Initialized_list的知识点,很碎,不好整理。不过也都好说。只要知道了ta的内部实现,大致都一样)
注意一点:用Initialized_list标准模板库声明出来的类型都是const的,也就是不能修改。
这个是官方的用例,一些简单测试。 其它的都应该很容易看懂。解释下c4这里,声明了一个const int指针,把c3.begin()指第一个元素的地址拿来了过来。然后是两次++;(这里有一个坑,就是可以看到控制台输出只有5,4没有3。这是为什么呢??这个就是迭代器的问题了。当我++两次的时候,c3_ptr正好指到元素3,而把c3_ptr做尾指针初始化的时候,Initialized_list会直接舍弃掉3,也就是不包含3。可以看下ta的内部实现,constexpr 的构造函数First,Last,非常的简单明了。 这个实现里面用到了99%的Cpp11的新特性,也正是这篇文章的主题。 )声明c4,拷c3.begin()~c3_prt的内容。c5声明 使用到了move函数(cpp11新特性)move操作,不发生任何的拷贝和内存分配。是直接接管了c4的对象。
3.renge-based for statement 语法规则:
for(del :coll)
{ statement }
这个就是范围for,冒号左边做变量,右边是个容器。看下怎么用,跟auto是怎么配和的
这个就是ta的用法。for循环我用auto 做了变量的引用,c是vector的容器变量。下面是对容器里的内容*3,然后输出。就有了控制台的显示的内容两次的for循环的对比。
4. share_ptr(详细看下这个怎么用,面试中必不可少的多少都会问到,)
share:共享的意思, 共享指针?听起来很玄乎。还有共享的指针?不错。share_ptr就是实现了一个叫做多个指针同时指向一个对象( reference count )。 深层的东西(里面有一层叫写时复制的东西)。修改的永远就是的这个对象的副本。当你触发,要修改的,写数据操作时,就会生成对象的一个副本,让你去改。而其它的就不会被影响到,也就是(copy_on_write)
官网:shared_ptr::shared_ptr - C++ Reference
unpire_ptr:独占指针,(类似引用)。同一时刻只能一个对象拥有。
weak_ptr:这个又叫弱引用指针。指在解决shared_prt循环引用的问题。(。)
总结:用法,ta也是模板类型,所以说使用的时候就想标准库那样声明使用。源代码分布和头文件实现细节都在memory.h头文件里了,有能力的可以选择去看看。
5. =delete ,=default (字面意思 =delete就是删除,=default就是生成默认构造函数。懒的解释了,就是在函数屁股后面,跟这两个关键字。写了删除就是删除,写了默认生成就是生成。)
6.&&(右值引用(“偷,窃取内存的意思”这个是关键,好奇喜欢的同学可以深入的了解一下。实现上挺有意思的。接管的意思,不发生内存分配)在字面变量和即将销毁的对象上使用。)
看下字面值最简单的用法:
再看下这个string,是不是有点不一样。原来的对象被销毁了。
7.std::move()(移动函数,左值转换为右值)
8.static_cast(左值转换为右值)
9. variadic template(可变参数模板,就类似lua(...)这种东西,其实也是实现了这么一个多参功能,也是用 “...”这个东西(省略号)) (模板的本质, 又是代码的复制。当传递多个参数对应的也会生成多个函数,类似auto(也是新特性)反向推导过程,判断生成。但, 这里叫做包(packet)分为模板参数包,跟函数参数包。)
语法规则与演示:
STL:
可见标准会已经对vector的底层实现做到了非常好的优化效果。写的再乱,申请的再差,连续不断的申请,始终都没超过1.5倍,还可以退回(shrink_to_fit())。
下面再谈迭代器失效;
10.shrink_to_fit (这个比较有意思了。标准库自身的增长和扩容机制,会带来一定的内存损耗。c11专门整出了一个这样的函数来(只适用于vector,deque,string,这个应该很容易想到,ta们内部的底层实现都是数组。一段连续空间,重新分配空间就会有多申请空间的情况。而,关联式容器就不会存在这种情况了。每添加一个元素,就在节点后边new一个),退回原来申请浪费的内存。但是,也并非如此,书上指到,不是每次申请都会退回内存,还需要根据具体实现情况。)
11.c11的关键字总结:从最简单常用到的开始,auto,long long, nullptr, constexpr, using(别名,就是另起一个名字,效果等价), decltype, = default, =delete, explicit, static_cast, noexcept(异常,N年不用一次,标准库天天用,可以说都用了)
下面开始Cpp17(filesystem)(听人传呼, 吹呼其神,简单看一下。)
1. filesystem(cpp17) (也就是2017一年),文件系统(filesystem)是一个很早存在的东西。像luafilesystem,php的很早就做了支持。 C++到2017年才做了支持。这个是官网的用列, 我拿来测试一下。
这个是官方网址: | Microsoft Docs">
未来(future)
下一版本cpp20,cpp23(这个估计不可能,因为老外不喜欢用“3”,具体来说是“13”。还是要根据年份来定,那一年发布,名字就会用那年的末尾数字)目前为止,c++版本的迭代都是以发布当年的年尾数字来命名。
cpp涵盖一生,贯穿之久,每个版本的迭代,都会解决一些已知的问题。标准会又提出了什么新特性,带来了什么样的好处,怎样的一个用法,解决了什么问题。可见标准会,考虑的是如此之多,相当周全啊。把上个版本的问题解决,留到下个版本,这就是新版本。(我只呼,摸鱼还是老外强啊!)
... 写到这里, 我不仅想说一句:什么时候能把迭代器失效解决一下,让ta怎么扯都断不了。都20,23了怎么还是这样子。 解决就解决呗,为何还搞一堆子新特性出来。
好的,结束吧!现在是凌晨1点,下着雨。我已经很累了。我是个从来不吹嘘自己有技术的人,暂时先发出来,有错误,遗漏的我还会上来继续改。加油!加油!骚年。
这个是我的QQ群:659877724,里面有C++的一生,从古至今。旨在解决那些还在被C++折磨的同学,和在使用C++ 做游戏开发服务器的大佬们。主在Moba,MMO,无缝世界大地图构建服务器上。也欢迎各路大佬前来。有玩过小岛秀夫游戏的也可以。
后记:
可能会更,面向对象,八大模式设计原则,为了抽象而抽象。听起来越来越玄乎了(哈哈哈...)。下面是我的伏笔。专门会讲解c++的面向对象。究竟是先有的面向对象还是设计模式?偷偷告诉大家一个答案(结论):没有面向对象谈不及设计模式。



