1.对象移动

1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力

2)优势:

  • 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能
  • 有些类如IO类或unique_ptr类包含不能被共享的资源,它们不能被拷贝但是可以移动

3)移动操作“窃取”资源,并不分配任何内存

2.右值引用

1)C++11引入右值引有来支持移动操作,绑定到右值的引用称为右值引用,使用&&来绑定。

 int& left=;                 //错误,左值引用必须绑定到左值上
int n=;
int& left=n; //正确
const int& left=; //正确,左值引用的一种特殊情况,可以将const的左值引用绑定到右值上 int&& right=; //正确,右值引用必须绑定到右值上
int&& right=n+; //正确,右值引用绑定到临时对象上

2)左值持久,右值短暂:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时变量。右值引用指向将要被销毁的对象

3.move函数

1)std::move用来获得绑定到左值的右值引用,头文件<utility>,一般不省略std::(避免名字冲突)

int&& right=std::move(n);       

2)调用move就意味着对编译器承诺:除了对源左值赋值和销毁之外,我们不对它进行其他任何操作

int main()
{
int n = ;
int&& right = std::move(n);
cout << right << endl; //输出:5
cout << n << endl; //输出:5 int num = std::move(n); //将得到的右值引用赋给一个左值,对于内置类型,源左值依然有效
cout << num << endl; //输出:5
cout << n << endl; //输出:5 string temp = "hehe";
string&& rig = std::move(temp);
cout << rig << endl; //输出:hehe
cout << temp << endl; //输出:hehe string str = std::move(temp); //将得到的右值引用赋给一个左值,对于类类型,源左值被清空
cout << str << endl; //输出:hehe
cout << temp << endl; //输出:空 return ;
}

运行结果:

最新文章

  1. 发布APP到app store
  2. 在 Delphi 中判断一个字符是中文的方法
  3. centos下 Vim快捷键操作命令大全
  4. POJ 1442 Black Box
  5. Freescale OSBDM JM60仿真器
  6. 从lambda到函数式编程
  7. 用linux的shell脚本把目录下面的所有文件的文件内容中的小写字母改成大写字母
  8. 第二章_session管理
  9. layer ifram 弹出框
  10. Vue.js的环境搭建
  11. python——爬虫&amp;问题解决&amp;思考(四)
  12. iOS 动画篇 之 Core Animation (一)
  13. [HNOI2007]紧急疏散
  14. LeetCode之“树”:Validate Binary Search Tree
  15. bzoj3534 [Sdoi2014]重建
  16. mysql处理重复数据
  17. 《python核心编程第二版》课后习题6-12答案
  18. Discuz! X3 全新安装图文教程
  19. 05 爬虫之scrapy
  20. 自定义配置编译linux内核

热门文章

  1. J2SE 8的集合
  2. CAAnimation临时取消动画,永久取消动画
  3. DataType 数据类型
  4. ArcGIS案例学习笔记1_1
  5. 求数组中的逆序对的数量----剑指offer36题
  6. Oracle VM VirtualBox做好虚拟硬盘后,如何进一步修改虚拟硬盘的大小
  7. java.lang.NullPointerException - 如何处理空指针异常
  8. datagrid数据表格的维护
  9. Element div is not closed
  10. 转---tcp三次握手四次挥手syn fin......