【C++11】 列表初始化 auto 范围for 新增关键字 新增容器

2023-11-14


1 列表初始化

由c语言的规则我们知道:一般只有数组才会支持用{}初始化,但是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;
}

但是这样初始化的原理是什么呢?其实在C++11中又增加了一个新的类:initializer_list
【initializer_list的介绍文档】

initializer_list使用场景:
std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值像vector,list等容器我们可以直接用{}赋值。
在这里插入图片描述比如下面这种用法:

int main()
{
 vector<int> v = { 1,2,3,4 };
 list<int> lt = { 1,2 };
 
 // 这里{"sort", "排序"}会先初始化构造一个pair对象
 map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
 
// 使用大括号对容器赋值
v = {10, 20, 30};
 return 0;

2 auto && 范围for

这个语法我们早在讲解C++入门的时候就已经讲解了,感兴趣的老哥可以点击下面链接:【C++入门基础】


3 新增关键字

3.1 decltype

关键字decltype将变量的类型声明为表达式指定的类型。
一些使用的场景:

template<class T1, class T2>
void F(T1 t1, T2 t2)
{
decltype(t1 * t2) ret;
cout << typeid(ret).name() << endl;
}
int main()
{
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // ret的类型是double
decltype(&x) p;      // p的类型是int*
cout << typeid(ret).name() << endl;
cout << typeid(p).name() << endl;
F(1, 'a');
return 0;
}

其实上面的这些场景用auto也可以很好的代替,但是下面的情况就不能够用auto代替了:
vector<decltype(x*y)>,由于vector中需要的是具体的类型,所以无法使用auto.

3.2 default

假设你要使用某个默认的函数,但是因为一些原因这个函数没有默认生成。比如:我们提供了自己写的默认构造,编译器就不会生成默认构造了。但是我们可以用default强制编译器生成。

class Person
{
public:
 Person(const char* name = "", int age = 0)
 :_name(name)
 , _age(age)
 {}
 Person(const Person& p)
 :_name(p._name)
 ,_age(p._age)
 {}
 Person() = default;
private:
 bit::string _name;
 int _age;
};

但是上面程序好像并没有实际价值,在学习了右值引用和移动语义后我们可以强制编译器生成默认的移动构造等等。

3.3 delete

如果想要限制某些默认函数的生成,在C++98中,我们应该怎么做?
将该函数设置成private,并且只声明补丁,这样只要其他人想要调用就会报错。
但是C++11提供了更加简易的方式:用delete关键字指定函数即可。

用法:

class Person
{
public:
 Person(const char* name = "", int age = 0)
 :_name(name)
 , _age(age)
 {}
 Person(const Person& p) = delete;
private:
 bit::string _name;
 int _age;
};
int main()
{
 Person s1;
 Person s2(s1);//报错

 return 0;
}

3.4 final与override

这两个关键字博主在继承与多态的文章详细介绍过,有兴趣的老哥可以移步:
【继承与多态】


4 总结

总的来说本次介绍的新语法还是挺简单的,都是一些基础的内容,C++11系列还有内容没有更新完,我们下次再见啦!! ❤️ ❤️❤️

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++11】 列表初始化 auto 范围for 新增关键字 新增容器 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • py2neo框架学习全网最详细教程

    py2neo框架学习 1 公式模式是语法范式 2 代码模式是实例 可按顺序复制执行 3 该教程全部使用py2neo的内置方法 不使用run运行neo4j 4 涉及所有可能的节点 节点类型 属性 关系 关系类型 属性的增删改查 1 连接图模型
  • 《C语言运算符100例》优先级面试错题

    建议先阅读基础教学 十万字C语言动漫教程 一 前言 运算符优先级一直是让人头疼的东西 趁着 字节取消大小周 的势头来临 通宵整理了一个思维导图出来 希望对你有所帮助 这篇文章 我会仔细分析这张思维导图 所有的 C语言运算符的用法都在这里了
  • minikube踩坑记

    minikube如何使用本地镜像 需要执行 eval minikube docker env 然后再重新打镜像 并运行即可 docker build t foo 0 0 1 kubectl run hello foo image foo 0
  • Android Things——SPI通信

    1 SPI 1 1 概念 SPI是串行外设接口 Serial Peripheral Interface 的缩写 SPI 是一种高速的 全双工 同步的通信总线 并且在芯片的管脚上只占用四根线 节约了芯片的管脚 同时为PCB的布局上节省空间 提
  • 顺序存储结构的插入与删除

    1 获得元素的操作 要获得线性表中第i个元素的值 只要i的数值在数组下标范围内 就把i 1下标的值返回即可 define OK 1 define ERROR 0 define FALSE 0 define TRUE 1 typedef in
  • 线性方程组的直接解法c语言,2 线性方程组的直接解法

    2 1 例题解答 例 2 1 用Gauss消元法解方程组 解 直接建立求解该方程组的M文件Gauss m如下 求解例题2 1 高斯法求解线性方程组Ax b A为输入矩阵系数 b为方程组右端系数 方程组的解保存在x变量中 先输入方程系数 A
  • GPIO / LED驱动编程开发

    GPIO LED 驱动开发编程 一般来说 GPIO的Pin都是可选功能的 GPIO x selects the function of GPIO Pin 为什么 不要问 操作 1 将某一个GPIO选择功能复用为GPIO 2 将该GPIO选择
  • MIT6.00 1x Lecture 1 - Introduction to Computation 学习笔记

    l MIT6 00 1x 麻省理工 计算机科学和Python编程导论 Lecture 1 Introduction to Computation 计算科学简介 1 1 Basics of computation 计算科学基础 Goal 本课
  • opencv形状目标检测

    1 圆形检测 OpenCV图像处理中 找圆技术 的使用 图像处理 双翌视觉OpenCV图像处理中 找圆技术 的使用 图像处理 双翌视觉https www shuangyi tech com news 224 htmlopencv 找圆心得
  • .h5文件的写入和读取(HDF5)

    先理解 h5文件的数据组织方式 h5文件中有两个核心的概念 组 group 和数据集 dataset 一个h5文件就是 dataset 和 group 二合一的容器 dataset 简单来讲类似数组组织形式的数据集合 像 numpy 数组一
  • python数据结构课堂笔记5:排序与查找

    排序与查找 文章目录 排序与查找 查找算法 顺序查找 算法分析 二分查找 算法分析 排序算法 冒泡排序和选择排序算法 冒泡排序Bubble Sort
  • C/C++内存泄漏及检测

    本文参考内存泄漏检测 该死系统存在内存泄漏问题 项目中由于各方面因素 总会有人抱怨存在内存泄漏 系统长时间运行之后 可用内存越来越少 甚至导致了某些服务失败 内存泄漏是最难发现的常见错误之一 因为除非用完内存或调用malloc失败 否则都不
  • 搭建J2EE开发平台-Eclipse+MySql+tomcat

    开完J2EE视频之后自己从网上把需要用到的东西下载了下来 分享之 首先是Eclipse开发环境 我记得在马士兵的一个教程里讲的是用lomboz Eclipse 不过那个视频讲的是06年的事了 并且lomboz官网上最新的也只有2007年出的
  • 'str' object has no attribute 'name'

    imgName E AndroidWork Bird Identification App master Bird Identification Server mask rcnn master images cars jpg 出错版 arg
  • UME - 丰富的Flutter调试工具

    背景 目前西瓜视频作者侧 Flutter 业务场景已经覆盖了 40多个页面 包括视频播放场景 用户侧核心场景包括我的 Tab 也已经是 Flutter 在开发过程中 暴露了一些问题 debug 调试难 离开了 IDE 后犹如抓瞎 PM 设计
  • 十六、K8s安全管理与资源限制

    实验环境 按照图示部署好了K8s集群 一个Master 两个worker nodes 访问控制概述 apiserver作为k8s集群系统的网关 是访问及管理资源对象的唯一入口 余下所有需要访问集群资源的组件 包括kube controlle
  • C语言【求最大公约数、最小公倍数】详解

    题目 从键盘输入两个数字 并求出他们的最大公约数 解题思路 一 当我们看到题目时 首先思考求什么是最大公约数 什么 是最小公倍数 最大公约数 指两个或两个以上共有的约数中最大的那个 最小公倍数 指两个或两个以上共有的倍数中最小的那个 接下来
  • Firewalld防火墙转换成Iptables

    关闭及停止使用 firewalld systemctl mask firewalld systemctl stop firewalld 安装iptables yum install y iptables services 生效及iptabl
  • Java海龟画图turtle多彩螺旋线

    利用turtle画多彩螺旋线 思路 在画正多边形的基础上 步长不是一直相同 而是越来越长 并且角度比画正多边形需要的角度多一些 每次拐弯变换颜色 Size是螺旋的大小 Step的每一步的长度 每走一步拐弯一次 Densi是密度 角度越小 螺
  • 【C++11】 列表初始化 auto 范围for 新增关键字 新增容器

    文章目录 1 列表初始化 2 auto 范围for 3 新增关键字 3 1 decltype 3 2 default 3 3 delete 3 4 final与override 4 总结 1 列表初始化 由c语言的规则我们知道 一般只有数组