【C++】C++11--- 列表初始化|关键字

news2025/1/10 17:20:43

目录

前言

列表初始化

创建对象时的列表初始化

单参数隐式类型转换

多参数的隐式类型转换

new表达式中使用列表初始化

列表初始化适用于STL 容器

模板类initializer_list

关键字auto

关键字decltype

关键字nullptr


前言

C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟,相比于C++98,C++11带来了数量可观的变化,其中包含了约140个新特性,以及对C++98标准中约600个缺陷的修正,这使得C++11更像是从C++98中孕育出的一种新语言;相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更加强大,而且能提升程序员的开发效率;

官方文档:C++11 - cppreference.com

列表初始化

C++98中,标准允许使用花括号{}对数组元素或者结构体元素进行统一的列表初始值设定;

struct person
{
	const char* name;
	int age;
};
int main()
{
	int array1[] = { 1, 2, 3, 4, 5 };
	//整型数组未指定初始化内容,按照默认值0初始化数组未指定的内容
	int array2[3] = { 1 };
	person p = { "Linda", 23 };
	return 0;
}

监视窗口:

C++11扩大了{}(初始化列表)的使用范围,使其可用于所有的内置类型与自定义类型,使用初始化列表时,可以添加等号,也可以不添加;

struct person
{
	const char* name;
	int age;
};
int main()
{
	int array1[]{ 1, 2, 3, 4, 5 };
	//整型数组未指定初始化内容,按照默认值0初始化数组未指定的内容
	int array2[3]{ 1 };
	person p{ "Linda", 23 };
	return 0;
}

监视窗口:

创建对象时的列表初始化

class Date
{
public:
	//构造函数
	Date(int year,int month,int day)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d2(2024, 6, 1);//c++ 98
	Date d1 = { 2024,5,1 };//c++ 11 (不推荐使用)
  	return 0;
}

运行结果:

单参数隐式类型转换

class Date
{
public:
	//单参数(缺省)的构造函数
	/*Date(int year=2000)
		:_year(year)
	{
		cout << "调用缺省单参数构造函数" << endl;
	}*/

	//单参数(无参)的构造函数
	Date(int year)
		:_year(year)
	{
		cout << "调用单参数(无参)构造函数" << endl;
	}
private:
	int _year;
};
int main()
{
	Date d1(2000);
	//d1-->自定义类型
	//10-->整型
	d1 = 10;//类型转换 
	return 0;
}

结论:无参的单参数构造函数与缺省的单参数构造函数皆支持隐式类型转换;

多参数的隐式类型转换

class Date
{
public:
	//Date(int year, int month, int day)//(不支持隐式类型转换)
	//Date(int year, int month, int day=1)//(不支持隐式类型转换)
	//Date(int year, int month=1, int day=1)//(支持隐式类型转换)
	Date(int year=1, int month = 1, int day = 1)//(支持隐式类型转换)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2022);//2022 1 1
	//2023-->int类型 d1-->Date类型
	d1 = 2023;//2023 1 1
	return 0;
}

结论:

  1. 多参数第一个参数无默认值,其余参数皆存在默认值支持隐式类型转换;
  2. 多参数所有参数都存在默认值支持隐式类型转换;
int main()
{
	//单参数
	string s1("abcdef");//直接调用构造函数
	string s2 = "abcdef";//隐式类型转换(单参数构造函数支持隐式类型转换) 
	//首先用常量字符串构造一个const string类型的匿名对象,然后匿名对象拷贝构造s2;
	//最后编译器优化为直接构造

	//多参数
	//构造+拷贝构造-->编译器优化为直接构造
	Date d3 = { 2024,5,1};//本质:隐式类型转换(多参数构造函数支持隐式类型转换)
	return 0;
}

new表达式中使用列表初始化

class Date
{
public:
	//全缺省的默认构造函数
	Date(int year=2024,int month=5,int day=1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2024, 3, 1);
	Date d2(2024, 4, 1);
	//自定义类型数组未指定初始化内容,按照自定义类型的默认构造函数初始化数组未指定的内容;
	Date* darr1 = new Date[3]{ d1,d2 };// c++ 98
	Date* darr2 = new Date[3]{ {2024, 3, 1},{2024, 4, 1},{2024, 5, 1} }; //c++ 11(推荐使用)
  	return 0;
}

监视窗口:

列表初始化适用于STL 容器

C++98中,对于自定义类型并不支持如下写法

vector<int> v = {1,2,3,4,5};//注:容器v中的参数个数是可变的

但是C++11中可以支持容器v中的参数为任意多个,本质原因为C++11中为各个STL容器提供了参数类型为initializer_list的构造函数;

模板类initializer_list

auto il = { 1, 2, 3, 4, 5 , 6, 7, 8};
//{}初始化列表传递给auto且初始化列表的数据类型为int,则il对象的类型initializer_list<int>

常用接口

int main()
{
	auto il = { 1, 2, 3, 4, 5, 6, 7, 8 };
	cout << "size=" << il.size() << endl;
	initializer_list<int>::iterator lit = il.begin();
	while (lit != il.end())
	{
		cout << *lit << " ";
		++lit;
	}
	cout << endl;
	return 0;
}

运行结果:

initializer_list的底层结构为两个指针,一个指向常量数组的起始位置,另一个指向常量数组的结束位置的下一个位置,那么vector的构造函数参数类型为initializer_list,如何支持容器vector中的参数为任意多个?

template <class T>
class vector
{
	typedef T* iterator;
	typedef const T* const_iterator;
public:
	//如何进行范围形式的初始化
	vector(initializer_list<T>& il)
	{
		_start = new T[il.size()];
		_finish = _start + il.size();
		_endofstorage = _start + il.size();
		iterator vit = _start;
		//利用迭代器进行赋值
		typename initializer_list<T>::iterator lit = il.begin();
		while (lit != il.end())
		{
			*vit++ = *lit++;
		}
	}
private:
	iterator _start;
	iterator _finish;
	iterator _endofstorage;
};

关键字auto

C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto也就毫无价值;

C++11中废弃auto原来的用法,将其用于实现自动类型推断,如此便要求必须进行显示初始化让编译器将定义对象的类型设置为初始化值的类型;

map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };

map<string, string>::iterator it1 = dict.begin();
//使用auto关键字避免手写特别长的迭代器类型
auto it2 = dict.begin();

注意:禁用auto做返回值的用法;

关键字decltype

auto使用时必须对auto声明的类型进行初始化,否则编译器不能推导出auto的实际类型;

  • 作用:decltype 关键字用于获取表达式的类型;
  • 用法:decltype(express) 用于获取表达式 express的类型,并将其作为变量的类型或者函数的返回类型;
  • 特点:decltype 不执行表达式,而是在编译期间分析表达式的类型

decltype 的多种应用场景

  • 获取变量类型:通过分析变量的初始化表达式,推导出变量的类型;
  • 获取表达式类型:根据表达式的类型,获取相应的类型信息;
int x = 5;
decltype(x) a = 10; // 推导 a 的类型为 int

std::vector<int> v = {1, 2, 3, 4, 5};
decltype(v.size()) size = v.size(); //推导size的类型为 std::vector<int>::size_type

关键字nullptr

由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能表示指针常量,又能表示整形常量;所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针;

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

欢迎大家批评指正,博主会持续输出优质内容,谢谢各位观众老爷观看,码字画图不易,希望大家给个一键三连支持~ 你的支持是我创作的不竭动力~

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

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

相关文章

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口&#xff0c;输入npm cache clean --force 回车执行 2.打开控制面板&#xff0c;在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除&#xff1a;点击Path&#xff0c;点击编辑。 把环境变量中和node有关的全部移除&#xff0c;然后点击确定。 3.重…

Linux中云盘/磁盘,爆满处理方式

1&#xff1a;du和df命令查看磁盘大小不一致 以下是阿里云服务器云盘使用率 运行 du -sh / 大小为20g 我的服务器大小为40g 按道理说这个云盘使用率应该是百分之五十 而运行 df -h / 这个命令是跟这个云盘使用率差不多的。 1.1分析原因 我安装了mysql&#xff0c;nginx…

能否直接上手 Qt ?——看完 C++ 课本后怎么做?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;如果你已经阅读了 C 课本&#xff0c;但仍然感到…

C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

QX-mini51单片机学习-----(3)流水灯

目录 1宏定义 2函数的定义 3延时函数 4标准库函数中的循环移位函数 5循环移位函数与左移和右移运算符的区别 6实例 7keil中DeBug的用法 1宏定义 是预处理语句不需要分号 #define uchar unsigned char//此时uchar代替unsigned char typedef是关键字 后面是接分号…

04、Kafka集群安装

03、Kafka 集群安装 1、准备工作 首先准备一台虚拟机&#xff0c;centos7系统&#xff0c;先在一台上配置安装后&#xff0c;最后克隆成多台机器。 1.1 安装JDK &#xff08;1&#xff09;下载JDK&#xff0c;上传到 /root/software 路径 下载地址&#xff1a;https://www…

【中级软件设计师】上午题15-计算机网络

上午题15-计算机网络 1 网络设备2 协议簇3 TCP和UDP4 SMTP和POP35 ARP和RARP6 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;7 URL8 浏览器9 IP地址和子网划分10 IPv611 Windows命令12 路由器 1 网络设备 物理层设备&#xff1a;中继器、集线器&#xff0…

【Linux】CAN根据时钟频率、波特率计算采样点详解

1、采样点知识回顾 参考博客:【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点 CAN 采样点是指在一个数据位的传输周期内,接收器实际采样数据的时间点。这个时间点是以百分比来表示的,它决定了在数据位的传输周期中,何时读取数据位的值。 正确设置采样点对…

【吃透Java手写】2-Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring&#xff08;下&#xff09;AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类&#xff0c;定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…

纯血鸿蒙APP实战开发——Canvas实现模拟时钟案例

介绍 本示例介绍利用Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 实现思路 本例的的主要实现思路如下&#xff1a; …

HTB Intuition

Intuition User nmap ┌──(kali㉿kali)-[~/…/machine/SeasonV/linux/iClean] └─$ nmap -A 10.129.22.134 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-30 05:29 EDT Nmap scan report for 10.129.22.134 Host is up (0.49s latency). Not shown: 998 …

前端面试题大合集3----网络篇

目录 一、Http协议详解&#xff0c;http请求方式&#xff0c;http状态码 Http协议详解&#xff1a; http请求方式&#xff1a; http状态码&#xff1a; 常用的状态码&#xff1a; 其他常用状态码&#xff1a; 二、Http常见请求方式 三、Http协议与TCP协议的区别和联系 …

美业SaaS系统多门店收银系统源码-【卡升组合促销规则】讲解分享

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、什么是卡升组合促销&#xff1f; 原价购买的卡项&#xff0c;卡状态正常的情况下&…

数值计算方法——大题题型总结

目录 一、绝对误差限、相对误差限 1.1 例题 1.2 解题套路 1.3 题解 二、敛散性、收敛速度 2.1 例题 2.2 解题套路 2.3 题解 三、牛顿迭代法 3.1 例题 3.2 解题套路 3.3 题解 四、割线法 4.1 例题 4.2 解题套路 ​4.3 题解 五、列主元素消去法 5.1 例题 5.…

增量同步笔记

2.2.2.增量同步 全量同步需要先做RDB&#xff0c;然后将RDB文件通过网络传输个slave&#xff0c;成本太高了。因此除了第一次做全量同步&#xff0c;其它大多数时候slave与master都是做增量同步。 什么是增量同步&#xff1f;就是只更新slave与master存在差异的部分数据。如图…

【快速入门Linux】10_Linux命令—Vi编辑器

文章目录 一、vi 简介1.1 vi1.2 vim1.3查询软连接命令&#xff08;知道&#xff09; 二、打开和新建文件&#xff08;重点&#xff09;2.1 打开文件并且定位行2.2 异常处理 三、vi三种工作模式&#xff08;重点&#xff09;3.1 末行模式-命令 四、常用命令4.0 命令线路图4.1 移…

ROS 2边学边练(44)-- 从头开始构建一个视觉机器人模型

前言 从此篇开始我们就开始接触URDF(Unified Robot Description Format&#xff0c;统一机器人描述格式)&#xff0c;并利用其语法格式搭建我们自己的机器人模型。 动动手 开始之前我们需要确认是否安装joint_state_publisher功能包&#xff0c;如果有安装过二进制版本的urdf_…

C++ stack、queue以及deque

1、stack和queue常用接口 严格来说栈和队列的实现是容器适配器 1、常用接口&#xff1a; 栈&#xff1a;top、push、pop、size、emptystack - C Reference (cplusplus.com) 队列&#xff1a;top、push、pop、swap、size、emptyqueue - C Reference (cplusplus.com) 2、deque&a…

Pycharm安装包numpy和matplotlib安装

环境 python 3.12 Pycharm 2023.1 安装包 创建图表的 numpy 库和 matplotlib 库 安装过程出现的问题 setuptools工具包没有安装 Python packaging tool setuptools not found文件 -> 设置 -> 项目:xxx -> python解释器界面显示不出已安装的软件包&#xff0c;系…

MQTT服务搭建及python使用示例

1、MQTT协议 1.1、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、基于发布/订阅模式的通信协议&#xff0c;通常用于物联网设备之间的通讯。它具有低带宽、低功耗和开放性等特点&#xff0c;适合在网络带宽有限或者网络连接不稳定…