【C++】c++ 11
目录
前言
列表初始化
std::initializer_list
右值引用和移动拷贝
左值和右值
左值引用和右值引用的区别
万能引用(引用折叠)
完美转发
默认成员函数控制
列表初始化
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:
//也算是兼容C
struct Point
{int _x;int _y;
};
int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}
C++11扩大了{ }(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
struct Point
{int _x;int _y;
};
int main()
{int x1 = 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C++11中列表初始化也可以适用于new表达式中int* pa = new int[4] { 0 };return 0;
}
创建对象时也可以使用列表初始化方式调用构造函数初始化:
class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2022, 1, 1); // old style// C++11支持的列表初始化,下面两个会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };return 0;
}
std::initializer_list
initializer_list是C++11新增加的容器,底层就是一个数组。
int main()
{//这里初始化其实是构造初始化,先不在意底层initializer_list<int> l = {0, 1, 2, 34};initializer_list<int>::iterator it = l.begin();while (it != l.end()){cout << *it << " ";it++;}cout << endl;
}
initializer_list平常并无作用,但是C++11对{}有特殊处理,它真正的应用场景是用于构造其它容器
//C++11为vector、map等容器都提供了initializer_list做参数的构造
//原理也很简单,先将{}转变成initializer_list,然后遍历initializer_list尾插即可
int main()
{vector<int> v = { 0, 1, 2, 3, 4, 5 };for (auto e : v) cout << e << " ";cout << endl;map<int, int> m = { {0, 1}, {1, 0}, {10, 9} };for (auto kv : m){cout << kv.first << ":" << kv.second << endl;}cout << endl;
}
右值引用和移动拷贝
左值和右值
首先先分清什么是左值,什么是右值——不是在=左边的就叫左值,在=右边的就叫右值
左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。
最显著的特点就是左值可以被取地址,右值不能被取地址(是否真的存储)
左值引用就是给左值的引用,给左值取别名。
// 以下的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;
右值不能被取地址,例如字面常量、表达式返回值,函数返回值(左值引用返回不是右值,传值返回才是右值)
右值引用就是对右值的引用,给右值取别名
// 以下几个都是常见的右值
10;
x + y;
fmin(x, y);
// 以下几个都是对右值的右值引用
int&& rr1 = 10;
double&& rr2 = x + y;
double&& rr3 = fmin(x, y);
左值引用和右值引用的区别
1.左值引用只能引用左值,不能引用右值;右值引用同理
2.const 左值引用可以引用左值也可以引用右值,但是反过来就不行
3.右值引用可以引用move后的左值
左值引用的使用场景: 做参数和做返回值都可以提高效率
为什么要有右值引用呢,主要是为了弥补左值引用的不足
场景:当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回, 只能传值返回。
例如:zzb::string to_string(int value)函数中可以看到,这里只能使用传值返回,传引用返回当该函数栈帧被销毁的时候该位置有可能被其他变量所占用,存在很大的问题,但是传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造),效率很低
zzb::string to_string(int x){bit::string ret;while (x){int val = x % 10;x /= 10;ret += ('0' + val);}
内置类型的右值叫做纯右值,将自定义的右值称为将亡值
我们先来看下面这两种情况
int main()
{bit::string s1 = bit::to_string(1234);bit::string s2;s2 = bit::to_string(2345);return 0;
}
下面的那个:
str拷贝给临时对象,临时对象拷贝构造给ret2
自定义创建时调用一次构造函数
函数栈帧销毁的时候,创建临时对象的时候调用拷贝构造
返回值作为右值给左值赋值的时候又调用拷贝构造

上面的减少的一次可以理解为没有产生临时对象了,直接赋值给ret2,这时编译器优化后的结果
老一点的编译器可能没有这样优化

如果是浅拷贝的类那还没事,但如果是深拷贝的类,短短一个赋值操作就要深拷贝三次,代价太大了,反正这个函数栈帧里的空间都要被销毁的,如果把它拿过来直接用的话,是不是就很方便了
所以就有了移动构造和移动赋值,这时候右值引用的价值就体现出来了,可以区分左值和右值了
如果参数传的是将亡值,则直接将资源交换,不仅减少了拷贝,还将不要的资源转移到了即将要销毁的空间,过后自动销毁,一举两得
移动构造——不用开辟空间,直接交换得到目标值,目标即将被销毁的时候使用


右值引用是间接起作用的,对深拷贝的类有意义
左值引用是直接起作用,传引用返回
右值被右值引用后的属性是左值
右值不能修改,但是被右值引用之后需要被修改——>属性变成左值(不能修改怎么转移资源,也就无法实现移动构造和移动拷贝)
万能引用(引用折叠)

函数模板下才有用!
可以接受左值和右值,左值的时候就相当于将两个&折叠成一个,所以也叫引用折叠
完美转发
按照上面的写法写即可
可以保持原有属性(右值被右值引用后属性变成左值)
默认成员函数控制

这里为什么条件那么严格呢?
其实这三个一般都是绑定在一起的,因为写了析构一般都设计深拷贝,所以也就要自己写拷贝构造和拷贝赋值,不然会出现问题
相关文章:
【C++】c++ 11
目录 前言 列表初始化 std::initializer_list 右值引用和移动拷贝 左值和右值 左值引用和右值引用的区别 万能引用(引用折叠) 完美转发 默认成员函数控制 列表初始化 在C98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列…...
uni-app 应用名称 跟随系统语言 改变
官方已确认BUG::https://ask.dcloud.net.cn/question/164804 { "name" : "%app.name%",//这里随便写,配置了 locales,name 就不生效了 "appid" : "", "description" : "", "versi…...
【大模型实战篇】高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍
1. 高质量数据过滤 1.1 背景介绍 数据质量对于大模型的训练至关重要,经常会听到一句话:数据决定模型的上限。模型的性能上限通常受到训练数据的质量限制。如果数据集不够好,模型可能无法学习到泛化的特征,导致其在新数据上的表…...
使用Python和Proxy302代理IP高效采集Bing图片
目录 项目背景一、项目准备环境配置 二、爬虫设计与实现爬虫设计思路目标网站分析数据获取流程 代码实现1. 初始化爬虫类(BingImageSpider)2. 创建存储文件夹3. 获取图像链接4. 下载图片5. 使用Proxy302代理IP6. 主运行函数 运行截图 三、总结 项目背景 …...
Python酷库之旅-第三方库Pandas(118)
目录 一、用法精讲 521、pandas.DataFrame.drop_duplicates方法 521-1、语法 521-2、参数 521-3、功能 521-4、返回值 521-5、说明 521-6、用法 521-6-1、数据准备 521-6-2、代码示例 521-6-3、结果输出 522、pandas.DataFrame.duplicated方法 522-1、语法 522-2…...
讨论人机交互研究中大语言模型的整合与伦理问题
概述 论文地址:https://arxiv.org/pdf/2403.19876.pdf 近年来,大规模语言模型发展迅速。它们给研究和教育领域带来了许多变化。这些模型也是对人机交互(HCI)研究过程的有力补充,可以分析定性和定量数据,再…...
OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 进行点在轮廓内的测试。 该函数确定点是在轮廓内、轮廓外,还是位于一条边上(或与顶点重合)。它返回正值&…...
GitLab CI_CD 从入门到实战笔记
第1章 认识GitLab CI/CD 1.3 GitLab CI/CD的几个基本概念 GitLab CI/CD由以下两部分构成。 (1)运行流水线的环境。它是由GitLab Runner提供的,这是一个由GitLab开发的开源软件包,要搭建GitLab CI/CD就必须安装它,因…...
微服务实战系列之玩转Docker(十五)
前言 博主的玩转Docker系列,今天正式开启第十五篇的征程! 在过去的十四篇中,涉及的内容有知识、有原理、有工具、更有实践。当你打开每一篇文章时,均会获得一个特定主题的知识和技巧,助你在云原生的世界里,…...
本地调试spark,访问kerberos鉴权的hdfs、hive
文章目录 准备连接hive的配置申请kerberos tgt在scala项目启动本地spark本地Jupyter Notebook启动pyspark 解决在wsl下进行开发、调试时,需要连接kerberos鉴权的hdfs、hive的问题 准备连接hive的配置 core-site.xml、hdfs-site.xml、yarn-site.xml、hive-site.xml复…...
Ubuntu 安装包下载(以20版本 阿里镜像站为例子)
Ubuntu安装包下载 上一篇文章写了一些国内常用的镜像站,这篇以阿里云镜像站Ubuntu20版本为例。 https://mirrors.aliyun.com/ubuntu-releases/ 1.点击自己想要下载的版本 2.点击以amd64.iso为结尾的文件,这个是安装文件,如果是桌面端&…...
会声会影Corel VideoStudio2025旗舰版最新中文旗舰版新功能讲解及使用会声会影使用教程
会声会影Corel VideoStudio2025旗舰版一款功能丰富的视频编辑软件。具有拖放式标题、转场、覆叠和滤镜,色彩分级、动态分屏视频和新增强的遮罩创建器,超越基本编辑,实现影院级效果。优化分屏剪辑功能,简化多时间轴编辑的工作流程&…...
【人工智能】OpenAI发布GPT-o1模型:推理能力的革命性突破,这将再次刷新编程领域的格局!
在人工智能领域,推理能力的提升一直是研究者们追求的目标。就在两天前,OpenAI正式发布了其首款具有推理能力的大语言模型——o1。这款模型的推出,不仅标志着AI技术的又一次飞跃,也为开发者和用户提供了全新的工具来解决复杂问题。…...
2024年TCGA基因表达数据下载(最新版)
文章目录 前言一、如何使用TCGA数据库获取公共数据?二、使用步骤1.点击Cohort Builder2.数据筛选3. Repository4.数据下载4.1 继续选择筛选条件4.2 添加cart并进入4.3 下载 总结 前言 TCGA 全称 The Cancer Genome Atlas ,即癌症基因组图谱。它是一个大型的癌症研…...
1. 运动控制指令概要(omron 机器自动化控制器)
机器自动化控制器——第一章 运动控制指令概要 1-1 运动控制指令PLCopen运动控制用功能块运动控制指令概要▶ 运动控制指令的种类▶ 状态变化▶ 运动控制指令的启动和状态▶ 异常处理▶ 执行运动控制指令时输入变量的变更(指令重启)▶ 通过选择缓存模式执行指令多重启动▶ 通过…...
依赖注入(Dependency Injection)
依赖注入是一种设计原则,主要用于减少类之间的紧耦合度,通过将对象的选择和创建逻辑外包给一个容器来实现动态注入。 适用场景: 当需要将对象的生命周期管理和依赖关系外包给外部容器时(如Spring DI容器)。当应用程序…...
PHP环境搭建
PHP环境搭建教程 PHP 是一种流行的后端开发语言,用于构建动态网站和 Web 应用程序。在开发和部署 PHP 项目之前,您需要设置一个适当的 PHP 环境。本教程将帮助您在不同操作系统上快速搭建 PHP 环境。 1. 环境准备 1.1 操作系统 本教程将介绍在以下操作…...
小叶OJ 2716: 过河问题 ← 贪心算法
【题目来源】http://xiaoye.ac.cn/problem.php?id2716【题目描述】 有 n 个人要渡河,但只有一条小船,这条小船一次只能坐下最多两个人,并且只有一副船桨。每个人划船的速度不一样,如果两个人一起上船,由于重量变大&am…...
LeetCode509:斐波那契数列
代码如下 class Solution { public:int fib(int n) {//这个是为了特殊n,当n 0时, 当 n 1时。if(n 0) return 0;if(n 1) return 1;//第一次开dp专题,连dp数组都忘记定义了。只写了下面,哭vector<int> dp(n 1, 0);dp[…...
5G前传-介绍
1. 引用 知识分享系列一:5G基础知识-CSDN博客 5G前传的最新进展-CSDN博客 灰光和彩光_通信行业5G招标系列点评之二:一文读懂5G前传-光纤、灰光、彩光、CWDM、LWDM、MWDM...-CSDN博客 术语: 英文缩写描述BBU:Building Baseba…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 ,你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
