当前位置: 首页 > news >正文

左值引用、右值引用、移动构造

1、为啥使用引用?

// An highlighted block
void function(string str)
{... ...
}

看上面这段代码,如果不采用引用的方法,那么在函数被调用的时候,编译器会有一个参数赋值的过程,这就导致了内存和效率的浪费。

// An highlighted block
void main()
{string ch = "abc";function(ch);
}

编译器暗中会执行string str = ch这句,导致效率和内存的浪费,为了解决这个问题C++11采用了引用的方法,减少内存的浪费。

2、有了左值引用,为啥要加入右值引用

// An highlighted block
void function(string& str)
{... ...
}

比如上面这个函数成功的解决了内存浪费的问题。但是有个新的问题,这个函数没法传入一个右值。什么是左值和右值?见收藏里的《一文读懂C++右值引用和std::move》,能取&的就是左值,不能的就是右值。

// An highlighted block
void main()
{function("abc");//编译不过
}

因为"abc"是一个右值,左值引用只能接受左值,所以报错。但是在日常使用中,我们非常希望能直接进行以上的编码。左值引用要能接受右值,只需要加const就行了。

// An highlighted block
void function(const string& str)
{... ...
}

但这又会出现一个新的问题,没法修改str的值,如果function需要对str进行修改,就出错了。为了解决这个问题C++11引入了右值引用。

3、右值引用

为了解决上面提到的问题function的代码调整为以下代码

// An highlighted block
void function(string&& str)
{... ...
}

右值引用只能接受右值,不能接受左值。

// An highlighted block
void main()
{string ch = "abc";function(ch);//编译不过
}

但是我们希望同时能传入一个左值过去,怎么办?这就引出了移动函数move(),这个函数的功能是传入一个左值,返回一个右值,即右值引用接受左值的方法。

// An highlighted block
void main()
{string ch = "abc";function(move(ch));//编译通过
}

4、移动构造

上面的代码中编译器暗中会执行string str = move(ch)这句,但是这一句会触发string的移动构造函数

// An highlighted block
class string
{
public:char* str;... ...string(string && s) : str(s.str){s.str = new char[1];s.str[0] = 0;}... ...
};

可以看到移动构造函数把参数s的内存清理了,值却给了自己。

http://www.lryc.cn/news/425587.html

相关文章:

  • tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink
  • Xil_DCacheFlushRange的用法
  • k8s使用subpathexpr和hostpath分pod名字持久化日志
  • FChen的408学习日记--三次握手和四次握手
  • Unity技巧:轻松实现鼠标悬停文本时的动态变色效果
  • 谷歌账号活动异常,或者申诉回来以后需要手机验证的原因,以及验证手机号的错误操作和正确操作
  • System V IPC奥秘:解锁共享内存、消息队列与信号量的高效通信之路
  • 怎么将pdf转为ppt文件?pdf转ppt的8个方法
  • 【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试
  • 如何在wordpress当中使用插件WP Coder(将html、css、javascript应用到wordpress上)
  • ActiveMQ、RabbitMQ、Kafka、RocketMQ在消息回溯、消息堆积+持久化、消息追踪、消息过滤的区别
  • 使用ITextRenderer导出PDF后无法打开问题,提示‘无法打开此文件‘
  • STL必须掌握的几大常见算法
  • HAproxy 七层负载均衡调度器详解及配置
  • Python学习笔记--私有属性、构造方法、析构方法、常用内置方法
  • 4章8节:用R做数据重塑,行列命名和数据类型转换
  • 浏览器发出请求到响应的过程
  • eNSP 华为划分VLAN
  • 公用事业公司签署大规模电力供应协议
  • C语言 | Leetcode C语言题解之第341题扁平化嵌套列表迭代器
  • 冷知识:编程第一人是位伟大的女性
  • Python爬虫使用实例
  • 主成分分析(PCA)
  • python实现生命游戏
  • 基于vue框架的CIA报价平台的设计与实现1xv02(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 【Kubernetes】k8s集群Pod控制器
  • 什么是NLP实体识别?
  • 掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘
  • 糟糕界面集锦-控件篇09
  • 喵喵蓝牙热敏打印机(下)