c++数据结构之c++11(一)

一.列表初始化

支持一切类型的对象(包括自定义类型和内置类型)用{}初始化,{}初始化也叫作列表初始化。

1.c++98和c++11支持的{}

当然,初始化还可以省略掉"=":

但注意,c++11**{}里数据的数量是限定死** 的,是构造函数的形参数量 ,那么像下面这样,支持任意多个参数的,究竟是什么呢?答案是initializer list。

2.initializer list(支持{}里任意多个参数)

这玩意是c++11提供的一个类模板。

2-1提供的成员

**即构造+迭代器+size。**既然支持迭代器,那么就支持范围for的遍历。

2-2上面v1初始化的底层

综上:有了c++11支持的{}(有限个参数数量)以及initializer list(多个参数数量),可以把任意类型,任意数量参数 的数据,通过{}进行初始化

二.右值引用和移动语义(boss难度)

1.基本概念

2.左值与右值

最直接的区分点就在于:左值能够取地址,而右值不行。

右值是些临时对象,匿名对象。

3.左值引用与右值引用

①.左值引用就是给左值取别名,右值引用就是给右值取别名:

形式上的区别就是左值引用用一个"&",而右值引用用两个"&"。

②.那么左右值引用可以玩交叉(右值引用给左值取别名,左值引用给右值取别名)吗? 答案是可以的,只是需要某些条件:

Ⅰ.右值具有常性 ,因此用左值引用给右值取别名时,需要在左值引用前加const,以防止权限扩大。所以c++11支持的const引用,不但有防止外界改x的功能,还有增加通用性,左右值都可以传的功能。

Ⅱ.用右值引用给左值取别名,需要走一个函数模板move,底层进行强制类型转换,将左值强制转换为右值。

但注意,move并不会改变左值属性,只是将表达式move(b)的属性变成了右值。

③.左值引用绑定表达式(rr1)的属性是左值,右值引用绑定表达式的属性还是???左值!

右值引用可以引用右值,但其引用的表达式本身的属性是左值。因此表达式是能够被修改的。

看到这里可能还是对这么设计的缘由发懵,别着急,第6小结,右值引用场景马上填坑。

4.引用延长生命周期

5.参数匹配

①.c++98

②.c++11

编译器根据实参属性去调用最匹配的f函数:

③.小坑

根据3.③,x参与了右值引用,但它的属性是左值,因此f函数调用的是左值的重载。

6.右值引用的使用场景(填第3小结坑)

①.回顾往事之左值引用的优势和局限

这二位的作用域里存在,且返回的是局部对象,出了作用域就销毁(析构),而传左值返回,返回的是别名(本身),而引用的底层是指针,那么返回被销毁的引用就相当于返回一个野指针,肯定是不行的。

那么这时候就有人说,用右值引用当返回值类型不就解决了吗?右值引用可以延长生命周期呐。但这种想法是错误的,析构是把栈帧里存储这个函数的空间完全释放,空间都没了,右值引用的续命还作数吗?肯定不行啊。那么怎样才能续命呢?答案在下面的移动构造和移动赋值。

②.移动构造和移动赋值

移动构造:是一个构造函数,只是形参的属性是右值引用。它的底层玩的是夺舍(swap),所以就意味着s和*this要发生改变,**既然要改变,右值引用绑定的表达式(s)的属性就需要是左值,右值是临时变量,没法改变的。**发生夺舍以后,就把要被释放的局部资源转移给了没被释放的对象,然后返回这个新的对象,进而实现了续命。由于是交换,无需拷贝,因此开销也不大。

当代码中没有移动构造或移动赋值时,以addstring函数为例,会去走传值返回,需要调用拷贝构造,开销会增加。

而有移动构造或移动赋值时,编译器将函数返回值识别为右值,那么返回时构造临时变量,就走移动构造,不需要调拷贝构造,只需swap夺舍即可,所以开销会减小。因此当出现移动构造或移动赋值时,系统会自动走右值引用返回,以降低开销。


我们下期见,see you again

相关推荐
iiiiyu1 小时前
IO流(二)
java·开发语言·数据结构·编程语言
折戟不必沉沙2 小时前
构造和析构函数能否是虚函数?能否调用虚函数?
c++
-To be number.wan2 小时前
算法日记 | STL- sort排序
c++·算法
不想写代码的星星2 小时前
编译期策略模式:当模板成为策略容器
c++
啦啦啦啦啦zzzz2 小时前
数据结构:平衡二叉树
数据结构·c++·二叉树
玖釉-2 小时前
Vulkan 中 Shader 的 vert、frag、mesh、comp 全面解析:作用、关系、特点与工程实践
开发语言·c++·windows·算法·图形渲染
智者知已应修善业2 小时前
【51单片机2个外部中断切换LED花样】2024-1-3
c++·经验分享·笔记·算法·51单片机
玖釉-2 小时前
Vulkan 示例解析:gltfscenerendering.cpp 如何渲染一个复杂 glTF 场景
c++·windows·图形渲染
落羽的落羽3 小时前
【算法札记】练习 | Week5
linux·服务器·c++·人工智能·计算机网络·算法·哈希算法