C++11 新特性

news2024/11/19 4:47:50

文章目录

  • 🍪统一列表初始化
  • 🍪左值引用,右值引用
    • 🥛概念和作用
    • 🥛使用场景
  • 🍪完美转发
  • 🍪可变参数模板

C++11是C++的一次大更新,出现了很多实用的语法和特性,所以我们很有必要学习他的新东西

🍪统一列表初始化

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加

初始化列表是如何初始化对象的呢?答案是通过调用其构造函数

以vector为例(其他容器都是一样的),看看底层实现
在这里插入图片描述
vector在C++11时,重载了一个新的构造函数,其中调用了initializer_List<T> il

  • initializer_list 更多内容
    在这里插入图片描述
    是std里的一个类,只要调用{}来为容器对象初始化,都会调用先将这个类生成一个临时变量,然后在通过这个临时变量来构造出所目的对象。前提是容器里重载了initializer_list作为参数的构造函数。

🍪左值引用,右值引用

🥛概念和作用

了解左值引用,右值引用前,我们先了解左值和右值

左值和右值都是数据的表达式

  • 左值:可以取地址+可以赋值
void test3()
{
    // 以下的p、b、c、*p都是左值
    int* p = new int(0);
    int b = 1;
    const int c = 2;
    // 以下几个是对上面左值的左值引用
    int*& rp = p;
    int& rb = b;
    const int& rc = c;
    int& pvalue = *p;
}
  • 右值:右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,不可以取地址
void test3()
{
    double x = 1.1, y = 2.2;
    // 以下几个都是常见的右值
    10;
    x + y;
    fmin(x, y);
    // 以下几个都是对右值的右值引用
    int&& rr1 = 10;
    double&& rr2 = x + y;
    double&& rr3 = fmin(x, y);
    // 这里编译会报错:error C2106: “=”: 左操作数必须为左值
    10 = 1;
    x + y = 1;
    fmin(x, y) = 1;
}

无论左值引用还是右值引用,都是给对象取别名

ps:右值是不可以取地址的,但是给取了别名后,会导致右值被存储到特定位置。且可以取到该位置的地址
在这里插入图片描述

  • 总结

左值:

  1. 左值引用只能引用左值,不能引用右值。
  2. 但是const左值引用既可引用左值,也可引用右值
    在这里插入图片描述

右值:

  1. 右值引用只能右值。
  2. 但是右值引用可以move以后的左值。
    在这里插入图片描述

🥛使用场景

  • 左值引用

优点:做参数和做返回值都可以提高效率。

缺点:但是当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回,只能传值返回。就势必会调用一次拷贝构造函数

在这里插入图片描述

  • 右值引用

优点:作为使用移动构造形参,将临时变量的内容剪切过来,这样可以提高效率。

这里介绍一下移动拷贝和移动赋值。(以自己造的string为例)
在这里插入图片描述
可以看到,移动构造和赋值都是进行内容的转移。这里和库里实现的效果一致。
在这里插入图片描述
s1的内容被s3窃取了。

移动构造和赋值一般都是把快要被释放掉资源的临时变量的资源进行转移,从而减少开销。上图演示的例子是错误示范。

🍪完美转发

void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
template<typename T>
void PerfectForward(T&& t)
{
    //Fun(t);
    //Fun(std::forward<T>(t));  // 完美转发
}
int test3()
{
    PerfectForward(10); // 右值
    int a;
    PerfectForward(a); // 左值
    PerfectForward(std::move(a)); // 右值
    const int b = 8;
    PerfectForward(b); // const 左值
    PerfectForward(std::move(b)); // const 右值
    return 0;
}

在这里插入图片描述

模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,
我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用“完美转发”

std::forward 完美转发在传参的过程中保留对象原生类型属性,从而调用不同的函数,减少开销,提高性能。

🍪可变参数模板


template<class ...args>
void show(args...)  // 显示args的参数列表个数
{
	cout << sizeof...(args) << " ";
}

void print() {}
template<class T ,class ...args>
void print(T head, args ...rest)
{
    cout << head << " ";
    print(rest...);
}

void test3()
{
    print(1, 2, 3.2, "x");
    show(1, "2", 'x', 6);
}

可变参数通过函数递归来进行打印数据,由于这是编译时进行的,所以必须得重载个空函数来表示递归结束。

更多详细

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[网络安全]DVWA之XSS(Stored)攻击姿势及解题详析合集

[网络安全]DVWA之XSS&#xff08;Stored&#xff09;攻击姿势及解题详析合集 XSS(Stored)-low level源代码姿势基于Message板块基于Name板块 XSS(Stored)-medium level源代码姿势双写绕过大小写绕过Xss标签绕过 XSS(Stored)-high level源代码姿势&#xff1a;Xss标签绕过 XSS(S…

汇编学习教程:灵活寻址(四)

引言 在上篇博文中&#xff0c;我们学习了 [bxsi] 的灵活寻址形式&#xff0c;由此讲解了汇编中的多重循环实现。那么本篇博文中&#xff0c;我们将继续学习灵活寻址其他实现形式。 本次学习从一道编程案例开始学起。 编程示例如下&#xff1a; assume cs:code,ds:datadata…

【Jmeter第二章】将Jmeter界面切换为中文显示

1、Jmeter临时切换为中文显示 注意&#xff1a;上面的配置只能保证本次运行是中文&#xff0c;如果要永久中文&#xff0c;需要修改Jmeter的配置文件 2、通过修改Jmeter配置文件设置为中文显示 1、在 Jmeter/bin目录下&#xff0c;找到&#xff1a;jmeter.properties 文件 2…

K_A39_012 基于STM32驱动W25Q32 模块读写数据 串口+OLED0.96显示

K_A39_012 基于STM32驱动W25Q32 模块读写数据 串口OLED0.96显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明时序对应程序: 四、部分代码说明1、接线引脚定义1.2、STM32F103C8T6W25Q32 模块 五、基础知识学习与相关资料下载六、视频效果展示与程序资料获取…

LeetCode 429. N 叉树的层序遍历

429. N 叉树的层序遍历 描述 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 示例1 输入&…

货拉拉Java开发实习

目录 1.Java的重载和重写有什么区别2.什么情况下需要用到重载3.有很多个字符串和变量&#xff0c;需要把它们加起来&#xff0c;这时候用String会有什么问题4.有没有其它的替代方案5.StringBuffer和StringBuilder有什么区别6.一个自定义对象&#xff0c;分别创建了两个实例&…

5分钟梳理银行测试,文末附带实战项目

很多银行招聘都要求有相关从业经验&#xff0c;这对于想跨入这个岗位的0经验从业同学可真犯了难 “你都不让我上岗&#xff0c;我哪来的工作经验呢&#xff1f;” 为了解决这个问题&#xff0c;小柠檬整理了本篇文章&#xff0c;从3个方面介绍银行项目是如何进行测试的 银行…

springboot---IoC 和 AOP

目录 引语IoC传统开发模式的弊端控制反转和依赖注入 AOP面向对象的局限性面向切面编程 总结 引语 Inversion of Control&#xff0c;缩写为IoC&#xff1a;控制反转 Aspect-oriented programming&#xff0c;缩写为AOP&#xff1a;面向切面编程 IoC和AOP是spring框架最核心的…

VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti

这个时候我们需要去关掉几个功能 1、关闭Hyper-V 打开控制面板首页&#xff0c;找到“程序”&#xff0c;然后找到“启用或关闭Windows功能”&#xff0c;找到“Hyper-V”&#xff0c;有勾中的全部都取消掉&#xff0c;如果这一步操作失败&#xff0c;不要紧&#xff0c;继续…

使用马哈鱼SQLFlow分析聚合函数中的数据流列

聚合函数通常将列作为参数&#xff0c;在本文中&#xff0c;我们将讨论在用作函数参数的列和聚合函数之间创建什么样的数据流。 1. COUNT() COUNT()可以采用COUNT()&#xff0c;也可以采用任何列名&#xff0c;甚至可以采用空参数。如果参数为空或为列&#xff0c;则参数和函…

DatenLord前沿技术分享 No.25

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…

【已解决】使用Arduino调试ARM时编译错误error: ordered comparison of pointer with integer zero的解决方法

在使用Arduino的资源库对STM32编程时&#xff0c;出现&#xff1a; error: ordered comparison of pointer with integer zero (byte* {aka unsigned char*} and int) 编译错误的解决方法。 Arduino因其开源和易用性&#xff0c;丰富的三方资源&#xff0c;受到很多人的喜欢…

Android无线调试

1、首先在系统环境变量——》新建——》"ANDROID_ADB_SERVER_PORT"&#xff0c;值&#xff1a;手机的端口号 2、通过adb kill-server&#xff0c;adb start-server&#xff0c;重启abd 3、最后使用&#xff1a;adb connect ip:port&#xff08;如&#xff1a;192.16…

【SpringBoot】SpringBoot 纯后端项目如何自定义异常页面(Whitelabel Error Page)

文章目录 背景安排方案步骤 验证 背景 一个短链服务&#xff0c;业务将长链接给我&#xff0c;我转换成短地址&#xff0c;用户访问短地址时&#xff0c;我再做redirect&#xff1b;没有前端&#xff0c;纯后端项目短链会有过期时间&#xff0c;过期后将返回错误信息某一天一个…

GPT 专业应用:如何让GPT策划方案

身为一名职场打工人&#xff0c;或多或少会面临需要写策划案的难题。 不管是策划一场线下活动&#xff0c;还是策划业务发展的方向&#xff1b; 甚至到生活中还需要策划婚礼&#xff0c;策划房屋装修&#xff0c;策划和朋友的聚会等等。那么如何快速积累经验&#xff0c;找准…

JavaScript全解析——Ajax教程(上)

AJAX 是Asynchronous JavaScript And XML的缩写。 它不是一种编程语言。它是一种基于HTML、CSS、JavaScript 和 XML&#xff0c;让开发更好、更快和更有互动的 Web 应用的技术。 什么是ajax 认识前后端交互 前后端交互就是前端与后端的一种通讯方式&#xff0c;主要使用的技…

关于一个C++项目:高并发内存池的开发过程(二)

文章目录 内存释放操作的总述thread cachecentral cachepage cachecentral cache的TODO实现何时维护这张映射表&#xff1f; tc_dealloc的修改申请大内存的适配写在最后 上篇文章梳理了内存申请操作的流程&#xff0c;大概测试了一下&#xff0c;没有发现什么问题。这篇文章将梳…

Simulink 自动代码生成电机控制:软件在环测试(SIL)步骤总结

目录 前言 模型配置 SIL模型生成 模型仿真对比 总结 前言 电机模型仿真可以叫做模型在环测试&#xff08;MIL&#xff09;&#xff0c;至于SIL就是软件在环仿真测试&#xff0c;说白了就是验证生成的代码有没有问题&#xff0c;如果有问题那在模型里面修复&#xff0c;不要…

点餐小程序实战教程05-点餐功能开发

目录 1 点餐需求分析2 变量定义3 点餐分类功能实现4 菜品展示功能开发5 实现切换分类时过滤数据总结我们上一篇设计了点餐分类及点餐信息数据源的功能,本篇我们介绍一下如何开发点餐功能。 1 点餐需求分析 看一下页面是分为两部分,左侧是侧边栏导航,用来展示点餐的分类信息。…

论文解读 | 《基于采样的MPC控制的约束视觉》

原创 | 文BFT机器人 引言 Introduction 视觉伺服控制方案&#xff0c;如基于图像的(IBVS)&#xff0c;基于姿态的(PBVS)或基于混合的(HBVS)&#xff0c;在过去的几十年里得到了广泛的发展。众所周知&#xff0c;要处理的主要问题涉及局部极小点或奇异点的存在、可见性约束、联合…