C++11(第一篇)【C/C++复习版】

目录

1、统一的列表初始化

2、所有容器新增initializer_list构造

3、auto、decltype和typeid

4、nullptr 

5、 范围for

6、STL中的变化

array(新容器)

 forward_list(新容器)

 cbegin、cend、crbegin、crend(新方法)

7、右值引用和移动语义(重点)

1)什么是左值?什么是左值引用?

2)什么是右值?什么是右值引用?

 3)什么是移动拷贝/赋值

 4)move

8、完美转发

右值引用和左值引用本身是左值还是右值? 

万能引用


1、统一的列表初始化

一切皆可以用{}初始化,且 = 可以不写 

2、所有容器新增initializer_list构造

注意:这两句代码用的不是同一个语法。

第一句代码是用initializer_list实现的,它是用一个常量数组构造一个initializer_list(原理是它有两个指针,指向数组空间的开始和结束位置),C++11里vector里实现了以initializer_list为参数的构造函数

第二句才是前面提到的列表初始化。

所有容器都实现了以initializer_list为参数的构造函数,都可以用上面的写法。

3、auto、decltype和typeid

1)auto可以进行类型推导,函数指针也可以用auto来定义推导。 

2)但如果我只是想声明一个变量,那么可以用decltype。

decltype(pf1)pf2;这句代码就是推导出pf1的类型然后用这个类型定义一个pf2。

decltype可以用来定义变量,也可以用来做模板实参,就是当一个类型用。

3)typeid也可以推导类型,但它只能打印来看,不能用。

4、nullptr 

nullptr也是C++11的,因为NULL在C语言里被定义成字面量0,会有一些歧义,所以有了nullptr。        

5、 范围for

范围for循环通过遍历给定容器的begin()和end()函数返回的迭代器范围,来遍历容器中的每一个元素。用的比较多,不多讲了。

6、STL中的变化

array(新容器)

相当于静态数组增加了一个越界检查功能。

 forward_list(新容器)

单链表,不支持尾插尾删,insert,erase也只支持了after。比较鸡肋。

 cbegin、cend、crbegin、crend(新方法)

返回const迭代器。

7、右值引用和移动语义(重点)

1)什么是左值?什么是左值引用?

左值是一个数据的表达式(如变量名或解引用的指针),我们可以获取它的地址,一般可以对它赋值,只有左值可以出现在赋值符号的左边,右值不行。左值引用就是对左值的引用,给左值取别名,左值引用的符号是&。

左值引用的使用价值:减少拷贝

1、做参数        2、做返回值     

但左值引用一直没有解决的问题是局部变量无法通过左值引用返回。  

2)什么是右值?什么是右值引用?

右值不能取地址,一般是在赋值符号右边,但不能出现在赋值符号左边。对右值取别名就是右值引用,右值引用的符号是&&。

内置类型的右值叫纯右值,自定义类型的右值叫将亡值

下面两个函数构成重载吗?

答案是构成,虽然两个函数都能用,但编译器会调用更匹配的那个,也是就第二个func,如果没有第二个func,第一个也行。

 3)什么是移动拷贝/赋值

对于右值将亡值,可以通过交换两个对象的资源来减少拷贝。对于下面的例子,加上编译器做出优化,虽然str是左值,但由于它出了作用域就销毁了,编译器会识别str是右值将亡值,然后调用右值引用的拷贝构造,即移动拷贝。

string& operator=(string && s) 和 string& operator=(const string & s)构成重载,如果是右值的拷贝构造,就调用第一个,否则调用第二个

需要深拷贝的类,才需要实现移动赋值。

 4)move

 move可以理解为将一个左值转成右值将亡值,然后将所有权转给另一个对象。

int main() {
    // 创建一个vector对象v1,包含一些整数
    std::vector<int> v1 = {1, 2, 3, 4, 5};

    // 使用std::move将v1的所有权转移给v2
    std::vector<int> v2 = std::move(v1);

    return 0;
}

8、完美转发

右值引用和左值引用本身是左值还是右值? 

int a= 10;
int &r = a;
int &&rr = 10;

r和rr都是左值,否则如果右值引用的属性不是左值的话,下面的场景就无法实现:

s本身是左值,才有可能传给swap(string& s)

万能引用

template<typename T>
void PerfectForward(T && t){
    Fun(t);
}

T&&:这是万能引用,既可以接收左值,也可以接收右值。

如果实参是左值,他就是左值引用(引用折叠)

如果实参是右值,他就是右值引用 

注意:因为左值和右值引用本身一定是左值,所以t本身一定是左值。所以最后无论传的实参是左值还是右值,调用的都是左值引用。

如何让t保持T它原本的属性? 完美转发

template<typename T>
void PerfectForward(T && t){
    Fun(forward<T>(t));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB网站服务器安全漏洞扫描环境搭建及漏洞工具扫描

一、适用环境 1、企业自建有门户网站&#xff1b; 2、使用Struts框架的WEB网站&#xff1b; 3、网站服务器涉及有数据库之类的项目&#xff0c;如&#xff1a;微信登录、手机登录、充值、收费等。 4、使用安卓版、苹果版、电脑版结合的缴费类网站平台。 5、方便但需提高安全性…

linux-centos修改时区时间

修改时区为北京时间 先输入tzselect&#xff0c;输入5&#xff0c;再输入9&#xff0c;再输入1&#xff0c;最后再输入1就行了 修改系统时间和硬件时间 查看当前时间 命令date修改系统时间 命令date -s "2024-04-21 18:30:30"查看硬件时间 命令hwclock --show修改…

AIGC Chat GPT 用思维导图总结,数据分析所需要掌握的Excel知识

你还不会制作思维导图吗&#xff1f; 现在已经可以零门槛一键生成&#xff0c;只需跟AI说一句话&#xff0c;就能完成&#xff01;&#xff01;&#xff01; 生成一个思维导图&#xff0c;主题是数据分析师需要掌握的Excel知识&#xff0c;在新窗口生成思念导图。 AIGC ChatG…

ONES 功能上新|ONES Wiki 新功能一览

支持在 ONES Wiki 页面中使用分栏进行横向排版&#xff0c;丰富排版方式&#xff0c;帮助用户以更丰富的版式展示内容。 应用场景&#xff1a; 页面的布局对内容的阅读有很大的影响。当页面中有图文混排的需求时&#xff0c;可以通过分栏来组织页面结构&#xff0c;以更清晰、更…

倾囊相授,ChatGPT干货技巧全在这里!如果没有这个方法我不可能学好ChatGPT

ChatGPT虽然已经问世一年多&#xff0c;但不少朋友还处于刚接触的阶段。于是&#xff0c;我们特别梳理了一些常见问题&#xff0c;尝试着用通俗的语言解释清楚这些内容。 1. ChatGPT的官方网址 https://www.chatgpt.com 你只要Google搜索能打开&#xff0c;这个网址肯定能打开。…

2024年成都市“蓉贝”软件人才年度评估及资金支持申报对象内容、材料要求

一、申报对象 经2023年评估合格的第一批&#xff08;2019年评聘&#xff09;、第二批&#xff08;2020年评聘&#xff09;、第三批&#xff08;2021年评聘&#xff09;“蓉贝”软件人才&#xff0c;2022年评聘的第四批“蓉贝”软件人才。 二、评估内容 &#xff08;一&#…

java和python刷题的一些语法规则总结(未完成)

语法总结 Java篇1、代码补全2、编程题中常用头文件3、编程题常用的内置方法4、模版 Python篇1、2、编程题中常用的头文件3、编程题中常用的内置方法4、伪代码模版 去哪练习&#xff1f; 1、LeetCode上有个面试模拟 2、牛客公司真题&#xff08;ACM模式&#xff09; ⚠️ 笔试均…

AI-数学-高中-44导数的运算法则

原作者视频&#xff1a;【导数】【一数辞典】3导数的运算法则&#xff08;略难&#xff09;_哔哩哔哩_bilibili 三种求导表达方式一样的&#xff0c;中间的比较常用&#xff1a; 链式法则&#xff1a;从外向内&#xff1a;

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

JavaScript实现代码雨

一、功能描述 使用canvas实现一个代码雨的功能&#xff0c;炫一个~~~ 二、上码 html <canvas id"canvas"></canvas> js let canvas document.querySelector(canvas);let ctx canvas.getContext(2d);// screen.availWidth:可视区域的宽度canvas.width…

Blender游戏资产优化技巧

创建视频游戏资产既具有挑战性又富有回报。 经过一些研究并根据我的经验&#xff0c;这里有三个技巧可以帮助你使用 Blender 优化游戏资产。 在 Blender 中优化游戏资源的三种技术可以归结为拥有高效的 3D 模型拓扑、通过烘焙优化纹理&#xff0c;以及最后通过 Blender 节点的…

【Spring AI 来了】

spring官方已经有Spring AI 插件&#xff0c;每个程序员必定拥抱AI&#xff0c;也意味着不就以后AI的open API 会成为我们开发成的基础jdk。 下面的内容也是AI直接根据网址给我翻译的&#xff0c;连格式都是生成的。AI应用已经渗透到各行各业了&#xff0c;并且会改变我们每个…

【八股】Java基础、集合、JVM

面向对象三大特性 1 封装&#xff1a; 将 方法 和 属性 写到同一个类中&#xff0c;并将属性 私有化&#xff0c;生成 get set方法&#xff0c;外部访问属性需要通过get和set方法,内部可以直接访问属性&#xff0c;这样的一个类我们认为它完成了封装。 2 继承&#xff1a; 子…

神经网络手写数字识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计4077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

python安装pytorch@FreeBSD

先上结论&#xff0c;最后在conda下安装成功了&#xff01; PyTorch是一个开源的人工智能深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;基于Torch库开发并维护。PyTorch提供了一个高效、灵活且易于使用的工具集&#xff0c;用于构建和训练深…

Python-VBA函数之旅-iter函数

目录 一、iter函数的常见应用场景&#xff1a; 二、iter函数使用注意事项&#xff1a; 三、如何用好iter函数&#xff1f; 1、iter函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 …

AndroidStudio 新建工程的基本修改及事件添加

注&#xff1a;2022.3.1&#xff0c;新建Empty Activity默认是Kotlin&#xff0c;可以选择新建Empty View Activity&#xff0c;修改语言为JAVA 应用名称 修改应用名称 路径&#xff1a;res-values-strings.xml 是否显示应用名称 路径&#xff1a;res-values-themes.xml …

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…
最新文章