C++11 新特性基础

news2024/11/26 11:56:25

前言

C++11是继,C++98/03之后的最大的一次更新,这次更新虽然花了很长的时间,但是真的推出了很多的干货!本期内容开始我们将介绍C++11常用的操作!

目录

前言

一、C++11介绍

二、统一的列表初始化

1、{}初始化

2、std::initializer_list 

三、声明

1、auto

2、decltype

3、nullptr

四、范围for

五、STL的容器新增


一、C++11介绍

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98成为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准
• 从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11增加的语法特性非常篇幅非常多,我们没办法一一讲解, 我们后面介绍的C++11都是常用的
如果想要了解更多的,请点击  C++11文档
关于C++11的一个小故事:

二、统一的列表初始化

1、{}初始化

在C++98中,标准允许使用花括号 {} 对数组或者结构体元素(对象)进行统一的列表初始化!
例如:
struct Point
{
	int _x;
	int _y;
};

int main()
{
	// 对数组使用 {} 进行初始化
	int arr1[] = { 1,2,3,3,4 };
	int arr2[3] = { 11,22,33 };
	// 对自定义类型的 结构体对象 使用 {} 进行初始化
	Point p = { 3,5 };

	return 0;
}

C++11扩大了用大花括号(即列表初始化)的使用范围,不仅可以使用{}来初始数组、结构体对象,还可以用于初始化自定义类型以及所有的内置类型!

注意:使用 {} 初始化时,可以带 = 也可以不带!

// C++11 可以使用 {} 初始化内置类型
int a1 = 3;
int a2 = { 3 };
int a3{ 3 };// 可以不带 =

// C++11 可以使用 {} 初始化, new 的表达式
char* ptr = new char[4]{ '0' };

创建对象时也可以使用列表初始化的方式调用构造函数初始化!

OK,着里就拿最简单的日期类举例:

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(2024, 8, 30);
	Date d2 = { 2024,8,29 };
	Date d3{ 2024,8,28 };
	return 0;
}

这里一定要注意:这三种方式看起来一样,实则不太一样!!!

第一个:Date d1(2024, 8, 30);

这个就是常规的用()中的参数去匹配对象的构造函数,然后构造!

第二个:Date d2 = { 2024,8,29 };

这个是用 {} 中的参数走的是隐式的构造(前提是该类的构造函数是单参数或者可以接收第一个参数的构造函数),也就是使用{}中的参数去构造一个临时的Date对象,然后在用这个临时的对象去拷贝构造 d2!

我们知道临时对象具有常性,我们可以用引用验证:

这是一种验证的方式,前面我们学过一个关键字:explicit 就是防止这种隐式类型转换的!

第三个:Date d3{ 2024,8,28 };

这个就是C++11的列表初始化,去初始化的!注意这个和第一个看似很像!但是不一样,和第二个仅仅是差一个 = 但是也不一样!我们发现加上explicit后第三个是正常的!

2、std::initializer_list 

initializer_list   是C++11提供的一个类型,它允许以简便的方式初始化各种容器或者其他对象!它 的主要目的是:不显示的使用构造函数的情况下,实现统一的初始化写法
它有点类似于数组,即是同一类型元素的一个序列!
initializer_list的接口也很简单,主要原因是他是做初始化的!
OK,见一下:
int main()
{
	auto il1 = { 1,2,3,4 };
	auto il2 = { '1', '2', '3' };
	cout << typeid(il1).name() << endl;
	cout << typeid(il2).name() << endl;
	return 0;
}

std::initializer_list 的使用场景

std::initializer_list 一般是作为构造函数的参数,C++11对不少的STL容器的构造函数和赋值拷贝都增加了它!这样就可以直接使用{}来初始化了!

OK,例如:vector、list、map等:

 其他就不一一列举了:

vector<int> nums = { 1,2,3 };
list<int> lt = { 1,5,8 };
nums = {0,0,9};// 赋值
map<int, int> mp = { {1,1}, {2,2},{3,3} };

这里唯一注意的一个就是map,他这个是先用里面的{}去构造了临时pair对象,然后去用列表初始化去构造的!

注意:{} 和 initializer_list不是同一个东西

  • {} 是一种初始化语法,用于初始化对象。
  • initializer_list 是一个类型,用于表示具有相同类型的元素列表。
  • 当一个类有接受 initializer_list 类型参数的构造函数时,您可以使用 {} 来创建该类的对象,并且编译器会将 {} 中的值转换为一个 initializer_list 对象来构造该对象。

三、声明

C++11提供了很多的简化声明方式,尤其是在使用模板时;

1、auto

C++98 auto 是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局
部的变量默认就是自动存储类型,所以 auto 就没什么价值了。 C++11 中废弃 auto 原来的用法,将
其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初
始化值的类型。
int a = 10;
auto pa = &a;

vector<int> nums = { 1,23,4,5 };
vector<int>::iterator it1 = nums.begin();
auto it2 = nums.begin();

for (const auto& e : nums)
{
	cout << e << " ";
}

2、decltype

decltype是declaration type的缩写,在C++中,decltype是一个类型推断的关键字,作用是将变量的类型声明为指定表达式的类型!他也是自动推导类型的;但是和auto不同的是,decltype是可以用推导出的类型定义变量的,这一点是auto做不到的!

// 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 就是 const int*
	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;
	F(1, 'a');
	return 0;
}

3、nullptr

由于 C++ NULL 被定义成字面量 0 ,这样就可能回带来一些问题,因为 0 既能指针常量,又能表示
整形常量。所以出于清晰和安全的角度考虑, C++11 中新增了 nullptr ,用于表示空指针。
C++11/C语言对NULL的定义:
#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

但是由于一些特殊定情况:

void func(void* ptr)
{
	cout << "func(void* ptr)" << endl;
}

void func(int tmp)
{
	cout << "func(int tmp)" << endl;
}

int main()
{
	func(0);
	func(NULL);
	return 0;
}

上述的调用都会匹配到整数0,如果要正确的调用就需要去强转:

但是这样做属实不优雅!所以C++11就引出了 nullptr 它的类型是 nullptr_t 。 nullptr  只能被隐式转换为指针类型,不能被隐式转换为整数类型。这就消除了 NULL可能带来的类型安全问题。

四、范围for

范围for 被戏称为语法糖;是一个非常好用的语法!这个我们在一开始在学习C++基础的时候就介绍过!它的底层是迭代器,我们在前面手搓轮子的时候也验证过:

vector<int> nums = { 1,2,3,4 };
for (int i = 0; i < nums.size(); i++)
	cout << nums[i] << " ";
cout << endl;

for (const auto& e : nums)
	cout << e << " ";
cout << endl;
在使用范围for的时候,一定要注意拷贝的问题,所以一般加上引用,如果只是访问不修改建议加上const!

五、STL的容器新增

C++11不光新增了用initializer_list类型的构造函数,而且还新增了一些容器:

其中unordered_mapunordered_set 我们前面介绍并模拟实现了!这里只介绍其他两个:

array

array其实就是一个静态的数组!他可以获取静态数组的元素个数等以及加强了越界的检查等,但是我个人觉得这个东西没什么用,以为我们呢有vector!

	array<int, 5> arr = { 1,2,3,4 };
	cout << arr[20] << endl;

以前的静态数组尤其VS是抽查,越的远一点就检查不到了!但是这个是直接用的断言!

forward_list

字面意思就是向前的链表,其实就是单链表!前面我们学的那个list是带头双向循环链表!

注意:forward_list是单链表,它的迭代器也是单向的!然后其他的接口和list一模一样!

OK,本期内容就介绍到这里,我是cp我们下期再见!

结束语:不畏艰难,深耕技术!

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

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

相关文章

【机器学习】循环神经网络(RNN)介绍

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 循环神经网络(RNN)介绍什么是RNN?RNN的基本原理递归神经网络单元前向传播反向传…

Ubuntu下安装和配置MQTT服务器Mosquitto

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;设计用于物联网设备之间的低带宽、不稳定网络环境下的高效通信。MQTT允许设备通过发布&#xff08;publish&#xff09;和订阅&#xff08;subscribe&#xff09;模式进行消…

清华2024内地录取3500人,其中900多人是走这个政策进来的... ...

2024年&#xff0c; 清华大学共录取本科新生3800余人&#xff0c;其中内地学生3500余人&#xff0c;覆盖全国31个省份1000 多所生源中学;港澳台学生60余人&#xff0c;国际学生约230人。 大李露个脸 清华大学2024年新生数据 普通批提前批共录取1549人&#xff0c;占比44% 强基计…

火龙果检测-目标检测数据集(包括VOC格式、YOLO格式)

火龙果检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1NdRBsHnYCK9xZd7bzQoN5w?pwd779l 提取码&#xff1a;779l 数据集信息介绍&#xff1a; 共有 1106 张图像和一一对应的标注文件 标注…

macos OneNote 2016 for Mac 官方pkg下载地址 - macos 10.15 Catalion 可用Onenote版本官方下载地址

macos 10.15 Catalion 版本的系统已经无法正常从应用商店下载到可用的Onenote 应用,原因是版本不受支持, 而且onenote官方链接的应用商店地址https://apps.apple.com/us/app/microsoft-onenote/id784801555?mt12在中国地区也无法访问, 所以中国地区用户如果想使用onenote应用…

【云原生系列之SkyWalking的部署】

1、分布式链路追踪 1.1概念 在较大的web集群和微服务环境中&#xff0c;客户端的一次请求需要经过不同的模块&#xff0c;多个不同中间件&#xff0c;多个不同机器一起相互协作才能处理完成客户端的请求&#xff0c;而在这一系列的请求过程之中,处理流程可能是串行执行,也可能…

华为云征文|基于Flexus云服务器X实例之安装长亭雷池waf教程

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面何为长亭雷池waf安装社区版雷池雷池环境要求查看华为云Flexus云服务器X实例的配置一条命令安装雷池waf检查查看是否安装成功 雷池使用登录雷池配置站点 写在…

51单片机.之ADC数字模拟转换

1、数字转模拟电路&#xff0c;输出波形&#xff0c;示波器采集来显示波形 单片机通过i2c给&#xff0c;模数转换器&#xff0c;写入数字信号&#xff0c;定时器1s扫描按键的切换 1、key.c 切换波形 #include <reg52.h>sbit KEY_IN_1 P2^4; sbit KEY_IN_2 P2^5; …

五、Selenium操作指南(一)

文章目录 一、基本用法&#xff08;一&#xff09;初始化浏览器对象&#xff08;二&#xff09;访问页面&#xff08;三&#xff09;设置浏览器大小&#xff08;四&#xff09;刷新页面&#xff08;五&#xff09;前进后退 二、获取页面基础属性三、定位页面元素&#xff08;一…

【QNX+Android虚拟化方案】112 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态

【QNX+Android虚拟化方案】112 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态 1. 读取 P1、P2 端口 主从模式 / 传输速率2. 读取 P1、P2 端口 Link Status3. 读取 P1、P2 端口 Duplex 全双工/半双工模式4. 读取 P1、P2 链路信号SQI质量5. 完整代码…

基于单片机的肺活量检测仪设计

本设计主要对其中的一种测量方法和原理进行介绍与运用&#xff0c;设计了一款基于STC12C5A60S2单片机的肺活量检测仪&#xff0c;包括供电模块、气流检测模块、按键模块、显示模块、语音输出模块和蓝牙模块&#xff0c;实现对肺活量的数值检测&#xff0c;并对数据进行语音播报…

linux固定ip

背景 VMware&#xff0c;centos7 查询 网关 linux指执行 ip addr 命令 拿到自动分配的ip : 192.168.150.102 [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ 执行: cd /etc/sysconfig/network-scripts/ 进入到network-scripts文件中 执行: vi ifcfg-ens33 编辑ifc…

PPT到PDF转换器:一个功能强大的Python GUI应用(unzip,convert,replace,merge)

在当今的数字时代,文档格式转换已成为一项常见需求。特别是将PowerPoint演示文稿转换为PDF格式,这不仅可以确保文档的一致性,还能方便分享和打印。今天,我们将深入探讨一个使用Python开发的强大GUI应用程序,它不仅可以将PPT转换为PDF,还具备文本替换、PDF处理和文件合并等多项功…

TDesign 微信小程序组件库配置

文章目录 1.安装 npm 包2. 构建 npm3. 构建完成后即可使用 npm 包。4.修改 app.json5.修改 tsconfig.json6.使用组件 1.安装 npm 包 在小程序 package.json 所在的目录中执行命令安装 npm 包&#xff1a; npm install结果报错 PS C:\WeChatProjects\miniprogram-1> npm i…

七、库存管理——调拨、预留业务

1、库存管理业务总览 2、转储过账和库存转移 3、转储过账 3.1 库存状态到库存状态&#xff08;类型较多&#xff09; 3.1.1 从质检库存转移到非限制使用库存 转储模式&#xff1a;事务类型A08&#xff08;转移过账&#xff09;凭证类型R10&#xff08;其他&#xff09;移动类…

Having trouble using OpenAI API

题意&#xff1a;"使用OpenAI API遇到困难" 问题背景&#xff1a; I am having trouble with this code. I want to implement AI using OpenAI API in my React.js project but I cannot seem to get what the issue is. I ask it a question in the search bar in…

java 教程-我的第一个JAVA程序

Java视频教程 我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程&#xff0c;本实例输出"编程字典&#xff0c;Java教程&#xff01;"&#xff0c;这也是所有语言入门的第一个实例程序&#xff1a; packagecodingdict.com; publicclassHelloWorld{ publi…

REGTR: End-to-end Point Cloud Correspondences with Transformers 论文解读

目录 一、导言 二、先导知识 1、3DRegNet 2、Kabsch-Umeyama算法 3、InfoNCE损失函数 三、相关工作 1、基于对应关系的配准 2、全局配准工作 3、过滤问题 4、Transformer 四、REGTR网络 1、降采样和特征提取 2、Transformer 交叉编码器 Transformer为什么要用FF…

MySQL高阶练习题2-没有广告的剧集

目录 题目 准备数据 分析数据 实现代码 总结 题目 找出所有没有广告出现过的剧集。 返回结果 无顺序要求 。 准备数据 create database db; use db;Create table If Not Exists Playback(session_id int,customer_id int,start_time int,end_time int); Create table I…

数据结构:(LeetCode 965)相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…