C++语法学习整理

news/2024/11/15 23:25:05/文章来源:https://www.cnblogs.com/gq-z/p/18548860

目录
  • 1、move与forward
    • move
    • forward
  • 2、左值和右值
    • 左值
    • 右值
    • 引用和值类别之间的关系
  • 3、

1、move与forward

move

  • 语法形式:std::move<T>(t),T 是要转换的对象的类型(通常可以通过模板参数推导自动确定),t 是要被转换(移动)的左值对象;
  • 应用场景:资源所有权转移
    • 1)容器元素移动:当需要高效地将一个容器中的元素移动到另一个容器时可以使用std::move,可以减少不必要的拷贝操作;
    std::vector<std::string> vec1 = {"apple", "banana", "cherry"};
    std::vector<std::string> vec2;
    vec2 = std::move(vec1);
    
    • 2)函数返回值优化:函数返回一个局部对象时,可以使用std::move来提示编译器进行移动语义而不是拷贝语义,将局部对象的资源所有权直接转移给函数调用者,不用拷贝从而提高性能;
    std::vector<int> create_vector() {std::vector<int> v = {1, 2, 3};return std::move(v);
    } 
    

forward

  • 语法:std::forward<T>(t),T 是一个模板参数指定的类型,t 是一个参数(通常是一个万能引用,即T&&形式的参数);
  • 应用场景:完美转发
    • 函数模板参数转发:用于在函数模板中实现完美转发,将函数的参数以其原始的值类别(左值或右值)传递给另一个函数。如下,wrapper函数可以接收任意函数 f 和任意参数 args ,并且通过 std::forward 将 args 以其原始的值类别转发给f。这样,f可以根据参数的实际值类别(左值引用或右值引用)进行最优化的处理,比如对于右值参数可以进行移动操作,对于左值参数可以进行正常的引用操作
    template<typename Func, typename... Args>
    auto wrapper(Func&& f, Args&&... args) {return f(std::forward<Args>(args)...);
    }
    

2、左值和右值

左值

  • 左值是指表达式结束后依然存在的持久对象。可以获取它的地址,并且能够对其进行赋值操作;在 C++ 中,变量名就是典型的左值;
  • 特性:
    • 可寻址性;
    • 可赋值性;

右值

  • 右值是指表达式结束后就不再存在的临时对象。通常是字面量、临时变量或者是函数返回值等这些不能获取地址,,并且不能对其进行常规赋值操作的对象;
  • 特性:
    • 临时性;
    • 不可赋值性;

引用和值类别之间的关系

  • 左值引用:用&来表示,它绑定到左值上。例如,int a = 5; int& ref_a=a;,这里ref_a是左值引用,它绑定到左值 a上,通过 ref_a 可以修改 a 的值;
  • 右值引用:用&&来表示,它主要用于绑定到右值上,如int&& rref = 5rref是右值引用,它绑定到右值5上;
    • 作用:允许我们对右值进行一些特殊的操作,比如将右值所代表的资源 “窃取” 过来,而不是进行拷贝操作,这在对象构造和赋值等操作中可以提高性能;

3、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834315.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现二

运行环境:jdk1.8、mysql5.x、idea、maven3.5/3.5 如果环境一致 运行不起来可以右侧联系我,包运行。 功能:管理员信息数据层Mapper、宠物信息数据层Mapper、宠物领养记录信息数据层Mapper、宠物评论信息数据层Mapper、宠物评论回复信息数据层Mapper、用户信息数据层Mapper 技…

Alpha冲刺(3/14)——2024.11.14

目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表 一、团队成员分工与进度成员 完成的任务 完成的任务时长 剩余时间施靖杰 编…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下,AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应用等场景开辟了新的可能性。在 RTE 2024 大…

2024-2025-1 20241305 《计算机基础与程序设计》第八周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第八周作业这个作业的目标 1、功能设计与面向对象设计 2、面向对象设计过程 3、面向对象语言三要素 4、汇编、编译、解释、执行作业正文 本博客链接教材学习…

基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现一

功能点:管理员信息实体类Entity、宠物信息实体类Entity、宠物领养记录信息实体类Entity、宠物评论信息实体类Entity、宠物评论回复信息实体类Entity、用户信息实体类Entity 技术点:SSM+JSP+Mysql+Bootstrap+JS+CSS 免费学习:猿来入此一、前言介绍: 免费学习:猿来入此 1.1 …

2024-2025-1 20241320 《计算机基础与程序设计》第8周学习总结

2024-2025-1 20241320 《计算机基础与程序设计》第8周学习总结 作业信息 |这个作业属于哪个课程| https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP |这个作业要求在哪里| https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08 |这个作业的目标| 功能设计与面向对象设…

项目冲刺11.15

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第七篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

Latex 安装

使用的开发环境是 VSCode. Latex 在编译时需要用到宏包. 宏包到底是啥? 有啥作用? 从何处下载? Latex 软件的安装:texlive: 一次性下载所有的宏包. 磁盘需求较大, 约 7 ~ 8 G.miktex: 仅下载必要的宏包, 编译时补充下载宏包. 磁盘需求较小, 约几百 M.清华大学开源软件镜像站…

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:…

Windows程序设计指南

Windows程序设计指南“到Petzold的书中找找”——仍然是解决Windows程式开发各种疑难杂症时的灵丹妙药。在第五版的《Windows程式开发设计指南》中,作者身为倍受敬重的WindowsPioneerAward(Windows开路先锋奖)得主,依据最新版本Windows作业系统,以可靠的取材资料校定这一本…

Windows高级调试

Windows高级调试中文版文档摘要: 本书《Windows高级调试》主要讲解Windows高级调试技术和工具,包括调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础…

iman——冲刺日志(第四天)

又一阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成了行程概览地图中标记连线与探索功能的删除与添加。 3 2前端 郭剑敏 实现了地图标点的驾车路线绘制功能。 3 1前端 王梓铭 优化了主页与导航栏布局,提…