【C++】C++11新特性——基础特性
文章目录
- 一、列表初始化
- 1.1 {}初始化
- 1.2 initializer_list类型
- 二、类型推导
- 2.1 auto
- 2.2 auto注意事项
- 2.3 decltype
- 三、新增与改进
- 3.1 nullptr
- 3.2 范围for
- 3.3 array
- 3.4 forward_list
- 3.5 unordered系列
- 3.6 final与override
一、列表初始化
1.1 {}初始化
C++11 引入了一个新的初始化方式, 称为初始化列表(List Initialize), 具体的初始化方式如下:
初始化列表可以用于初始化结构体类型, 例如:
struct Test
{int _a;double _b;
};int main()
{Test tOld = { 1, 1.1 };Test tNew{ 2, 2.2 };// 列表初始化int a = 1;int b = { 1 };// 列表初始化int c{ 1 };// 列表初始化int arr1[] = { 1,2,3 };int arr2[]{ 1,2,3 };// 列表初始化return 0;
}
以前{}只能用来初始化结构体和数组,而现在一切皆可用列表初始化。
当然new操作符也可以使用{}初始化:
int* ptr1 = new int[] {1, 2, 3};
Test* ptr2 = new Test[]{ {1, 1.1}, {2, 2.2} };
对于自定义类型{}会调用它的构造函数初始化:
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;std::cout << "Date(int year, int month, int day)" << std::endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(1, 2, 3);Date d2{1, 2, 3};return 0;
}

其他一些不方便初始化的地方使用, 比如stl的初始化, 如果不使用这种方式, 只能用构造函数来初始化, 难以达到效果 。
int main()
{std::vector<int> v={ 1, 2, 3, 4, 5 };// 列表初始化std::list<int> lt{ 1, 2, 3, 4, 5, 6 };// 列表初始化for (auto& e : v){std::cout << e << " ";}std::cout << "\n";for (auto& e : lt){std::cout << e << " ";}std::cout << "\n";return 0;
}

这里明显不是使用构造函数初始化的
那么这里是怎么做到的呢?
利用std::initializer_list类型。
1.2 initializer_list类型
int main()
{auto tmp = { 1, 2, 3, 4 };std::cout << typeid(tmp).name() << std::endl;return 0;
}

typeid(变量名).name() 查看变量的类型
我们可以把它理解为一个存在常量区数组。
这个容器有以下接口:

这样我们就可以像迭代器一样使用这个容器。
所以vector和list就可以这样初始化:


其实使用initializer_list初始化就是遍历initializer_list的内容然后一个一个插入。
vector(initializer_list<T> il):_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(il.size());// 防止过度扩容typename initializer_list<T>::iterator it = il.begin();while (it != il.end()){push_back(*it);++it;}
}
二、类型推导
2.1 auto
auto的作用就是自动推导对象的类型。从这个意义上讲,auto并非一种"类型"声明,而是一个类型声明时的"占位符",编译器在编译时期会将auto替换为变量实际的类型。
double foo()
{return 1.1;
}struct Test
{};int main()
{// 内置类型int a = 1;auto b = a;// intauto c = foo();// double// 自定义类型Test test;auto ret = test;// struct Testreturn 0;
}
2.2 auto注意事项
1️⃣ 首先定义变量的时候一定要初始化
auto a;// error
a = 10;
2️⃣ 不能作为函数的形参
void func(auto a) {}// error
3️⃣ 变量不能作为自定义类型的成员变量
struct Test
{auto a = 1;// error
};
4️⃣ 不能是auto数组
auto arr[] = { 1, 2, 3 };// error
5️⃣ 模板实例化类型不能是auto类型
std::vector<auto> v;// error
2.3 decltype
关键字decltype将变量的类型声明为表达式指定的类型。我前面用的typeid(x).name()可以拿到x类型的字符串,但是不能使用这个再去定义一个变量。
而decltype却可以拿到变量,后面还可以继续使用这个类型定义出变量。
int main()
{int x = 0;decltype(x) a = 10;// intdouble y = 0.0;decltype(x + y) b;// doublereturn 0;
}
三、新增与改进
3.1 nullptr
nullptr 是为了解决原来 C++中 NULL 的二义性问题而引进的一种新的类型,因为NULL既能表示整型也能表示指针。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif /* NULL */
3.2 范围for
在 C++中 for 循环可以使用基于范围的 for 循环,示例代码如下:
int main()
{int a[] = { 1, 2, 3, 4, 5, 6 };for (int& e : a){std::cout << e << " ";}std::cout << '\n';return 0;
}
3.3 array
template < class T, size_t N > class array
array就是个数组,它跟vector的区别是array是静态数组,不能扩容。
那么它跟普通数组有什么区别呢?
普通的数组对越界的检查是随机的,如果越界可能不会报错,但是array一定能检查出来。
int main()
{int a1[10];a1[22];// 不报错std::array<int, 10> a2;a2[22];// 报错return 0;
}
3.4 forward_list
template < class T, class Alloc = allocator<T> > class forward_list
forward_list就是一个单链表,它只有头插和头删接口,并没有尾插和尾删接口。
int main()
{std::vector<int> a = { 1, 2, 3, 4, 5, 6 };std::forward_list<int> lt(a.begin(), a.end());for (auto& e : lt){std::cout << e << " ";}std::cout << '\n';return 0;
}
3.5 unordered系列
这个在之前的文章有详细介绍:
【C++】哈希
跟map与set相比效率得到了大提升。
3.6 final与override
这里在多态里面有过详细介绍:
【C++】多态
final关键字在父类修饰虚函数,表示该虚函数不能再被重写。
override在子类修饰虚函数,检查子类是否重写,如果没有重写则编译报错。
相关文章:
【C++】C++11新特性——基础特性
文章目录一、列表初始化1.1 {}初始化1.2 initializer_list类型二、类型推导2.1 auto2.2 auto注意事项2.3 decltype三、新增与改进3.1 nullptr3.2 范围for3.3 array3.4 forward_list3.5 unordered系列3.6 final与override一、列表初始化 1.1 {}初始化 C11 引入了一个新的初始化…...
Mac 遇到pip: command not found问题的解决
Mac 遇到pip: command not found问题的解决在学习Playwright时候,需要下载相关依赖Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或…...
[ 云计算 | Azure ] Episode 03 | 描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx
正常情况如果你不是会计,或者对钱相关的数字比较敏感的财务,本文的一些东西你不会接触的,但是最为云架构或者云运营,你可能会遇到如何采购亦或者估算的我成本和运营成本等等,所以本文的一些知识点就需要进行一定的了解…...
STM32F103R8T6 SPWM实现正弦波输出
前言 PWM合成正弦波,原理什么的不详细说了,概括一下就是 PWM有效面积的积分 正弦波的有效面积。PWM的频率越快,细分的越多,锯齿也就越不明显。 做法是:首先利用正弦波取点软件,取点1000个,生…...
Oracle 11g创建和删除数据库实例
一、创建数据库实例 1.点击“开始” -> “Oracle -OraDb11g_home1” -> “Database Configuration Assistant” 2.点击“下一步” 3.选择“创建数据库”,点击“下一步” 4.默认设置,不用更改,直接点击“下一步” 5.填写要创建的“实例…...
MySQL(四)视图、存储过程、触发器
视图、存储过程、触发器视图检查选项视图的更新存储过程存储过程基本语法变量系统变量用户自定义变量局部变量if判断参数casewhile循环repeat循环loop循环cursor游标handler条件处理程序存储函数触发器视图 视图(View)是一种虚拟存在的表。视图中的数据…...
在 Ubuntu 下编写 C++
在 Ubuntu 下编写 C 在 Ubuntu 上面编写 C,本章节内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编 辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim…...
Linux主要目录的意思
Linux目录的意思 文章目录Linux目录的意思bin目录(命令目录):二进制目录,二进制是可以直接执行的机器码,里面存放着可以执行的命令;bin目录右下角有个箭头类似于Windows的快捷方式 sbin目录:系…...
启动golang项目编译的exe可执行文件获取windows管理员权限(UAC)
背景: go代码启动以后里面涉及到修改ip地址等操作,需要管理员权限。打包好的exe文件双击执行默认是没有管理员权限的,那么修改ip就会提示需要管理员权限。 解决方法1:右键以管理员权限运行exe文件 解决方法2:编译exe…...
Springboot怎么快速集成Redis?
前言其实在Springboot中集成redis是一个非常简单的事情,但是为什么要单独输出一篇文章来记录这个过程呢?第一个原因是,我记性不是太好,这次把这个过程记录下,在新的项目搭建的时候或者需要在本地集成redis做一些其他相…...
COM技术简单介绍
COM (Component Object Model) 是一种面向对象的编程技术,它在 Windows 操作系统中广泛使用。COM 提供了一种标准的方法来创建和使用可重用的软件组件,这些组件可以通过不同的编程语言和应用程序进行访问和使用。 COM 技术的主要特点包括: 组…...
NetworkMiner网络取证分析工具(26)
预备知识 NetworkMiner是一款windows平台下开放源代码的网络取证分析工具,同时也是一款比较好的协议分析工具,它通过数据包嗅探或解析PCAP 文件能够检测操作系统,主机名和网络主机开放的端口。 除了能够进行基本的数据包抓取分析N…...
Lombok 常用注解
文章目录简介MAVEN 依赖常用的注解1. Data 注解 :2. Setter 注解:3.Getter 注解:4.Log4j or Slf4j 注解5.NoArgsConstructor注解:6.AllArgsConstructor注解:7.RequiredArgsConstructor注解:8.Builder注解:9.Cleanup注解…...
SAP 生产订单和成本收集器在核算上的主要区别
生产订单: 特点: 1、 按照批次进行核算 2、 只有完全完工,才能够进行差异分析,分析差异来源。 目标制造费用:按照工单创建确认的作业数量*计划作业价格的乘积得到; 实际制造费用:按照作业确认…...
Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
场景 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流: Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_win nginx-rtmp最新版_霸道流氓气质的博客-CSDN博客 Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流&…...
【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)
【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)实验目的实验内容实验步骤一、下载Anaconda安装包二、安装Anaconda3三、验证Anaconda是否安装成功四、Jupyter Notebook的使用1. 启动Anaconda自带的Jupyter Notebook2. 在code…...
Python3-输入和输出
Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。…...
Java后端通用接口设计
1、接口的响应要明确表示接口的处理结果 为了将接口设计得更合理,我们需要考虑如下两个原则: 对外隐藏内部实现。即服务A调用服务B,如果服务B异常,但是我们不要直接把服务B的状态码、错误描述直接暴露给用户; 设计接…...
万字长文带你走进MySql优化(系统层面优化、软件层面优化、SQL层面优化)
文章目录系统层面优化采用分布式架构使用缓存使用搜索引擎软件层面优化调整 MySQL 参数配置定期清理无用数据创建索引创建索引普通索引唯一索引全文索引组合索引空间索引主键索引外键索引索引前缀适合创建索引的场景不适合创建索引的场景优化表结构分库分表SQL优化explain执行计…...
云原生安全2.X 进化论系列|云原生安全2.X未来展望(4)
随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展,成为赋能业务创新的重要推动力,并已经应用到企业核心业务。然而,云原生技…...
基于LabVIEW的车床主体振动检测系统:CSV数据导入、滤波分析与时频域可视化
温馨提示:文末有联系方式系统概述 本系统采用LabVIEW平台开发,专为车床主体结构振动特性评估而设计,具备高精度数据采集与智能分析能力,适用于设备健康状态诊断与工艺优化场景。数据导入与预处理 系统支持标准CSV格式振动数据文件…...
Linux实战——Finalshell高效连接与服务器管理
1. 为什么选择Finalshell管理Linux服务器 第一次接触Linux服务器管理时,我试过好几种连接工具。从最基础的Putty到Xshell,再到MobaXterm,最后发现Finalshell才是真正适合中国开发者的神器。它不仅免费,还集成了SSH连接、文件传输、…...
低代码AI开发:这些工具让AI原生应用开发效率提升10倍
低代码AI开发:这些工具让AI原生应用开发效率提升10倍 关键词:低代码开发、AI原生应用、开发效率、AutoML、拖拽式建模、企业级AI落地、工具链整合 摘要:传统AI开发需要精通算法、数据处理和工程实现,门槛高且周期长。本文将揭秘“…...
Leather Dress Collection镜像免配置:预装SD1.5+12LoRA+app.py开箱即用
Leather Dress Collection镜像免配置:预装SD1.512LoRAapp.py开箱即用 想快速生成各种酷炫的皮革服装设计图,但被繁琐的模型下载、环境配置和参数调试劝退?今天介绍的Leather Dress Collection镜像,就是为你准备的“开箱即用”解决…...
告别复杂状态机:用C语言结构体数组为STM32设计可维护的多级菜单
用结构体数组重构STM32菜单系统:从状态机到模块化设计的进阶之路 在嵌入式开发中,菜单系统是许多产品不可或缺的交互界面。传统的状态机或switch-case实现方式虽然直接,但随着功能迭代,代码往往会变得臃肿难维护。我曾接手过一个使…...
ArcGIS10.2许可服务启动失败?别急着重装,试试这个命令行修复大法(附端口冲突排查)
ArcGIS 10.2许可服务启动失败的终极排查指南:从命令行到端口冲突解决 当你面对灰色的启动按钮和毫无反应的ArcGIS License Administrator界面时,那种挫败感我深有体会。作为地理信息行业的从业者,我们常常依赖ArcGIS完成关键工作,…...
如何用OB_Template构建你的终极读书笔记系统:Obsidian新手完全指南
如何用OB_Template构建你的终极读书笔记系统:Obsidian新手完全指南 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/g…...
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力
Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力 1. 引言:为什么选择这段30秒视频 今天我要带大家近距离观察Chord视频理解工具的实际表现。不同于传统的技术参数罗列,我们将通过一段精心挑选的30秒视频&#x…...
ColorControl开源显示调校工具:从新手到专家的HDR优化之路
ColorControl开源显示调校工具:从新手到专家的HDR优化之路 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 在数字显示技术快速发展的今天ÿ…...
Kerbrute组合暴力破解:用户名密码组合文件测试的完整教程
Kerbrute组合暴力破解:用户名密码组合文件测试的完整教程 【免费下载链接】kerbrute A tool to perform Kerberos pre-auth bruteforcing 项目地址: https://gitcode.com/gh_mirrors/ke/kerbrute Kerbrute是一款专门用于通过Kerberos预认证进行Active Direct…...
