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

目录

前言

列表初始化

创建对象时的列表初始化

单参数隐式类型转换

多参数的隐式类型转换

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.mfbz.cn/a/604951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索网站支付系统的奥秘,从Vue3和Spring Boot开始(入门级项目实战+在线教程)附赠项目源码!

你是否曾经在购物时&#xff0c;对着电脑屏幕前的“支付成功”四个字感到好奇&#xff1f;这背后的秘密究竟是什么&#xff1f; 今天&#xff0c;让我们一起揭开支付系统的神秘面纱&#xff0c;探索其背后的技术实现。 在这个基于Vue3和Spring Boot的支付项目实战中&#xff…

ChatGLM-Math:强化数学能力

大型语言模型&#xff08;LLM&#xff09;在文本摘要、问答和角色扮演对话等语言任务上表现出色&#xff0c;在数学推理等复杂问题上也具有应用潜力。 但目前提高 LLM 数学问题解决能力的方法&#xff0c;往往会导致其他方面能力的下降。例如RLHF的方法&#xff0c;虽然可以提…

Linux的虚拟机操作

一、linux系统 我们知道的系统用到的大多数是Windows系统。 Windows个人用到的有&#xff1a;win7 win10 win11 winxp 服务器用到的有&#xff1a;windows server 2003、2008、2013...........等等 linux也有系统。 centos 7 有5、6、8等等 redhat ubuntu kail 二、了…

Apple强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片潜力

Apple 的最新强大功能&#xff1a;在新款 iPad Pro 和 iPad Air 中释放 M4 芯片的潜力 概述 Apple 推出配备强大 M4 芯片的最新 iPad Pro 和 iPad Air 型号&#xff0c;再次突破创新界限。新一代 iPad 有望彻底改变我们的工作、创造和娱乐方式。凭借无与伦比的处理能力、令人惊…

kubebuilder(6)webhook

operator中的webhook也是很重要的一块功能。也是相对比较独立的模块&#xff0c;所以放在后面讲。 webhook是一个callback&#xff0c;注册到k8s的api-server上。当某个特定的时间发生时&#xff0c;api server就会查询注册的webhook&#xff0c;并根据一些逻辑确认转发消息给…

练习题(2024/5/8)

1 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;…

第2章.STM32开发C语言常用知识点

目录 0. 《STM32单片机自学教程》专栏总纲 2.1. STM32嵌入式开发C语言编程的不同 2.2. C语言常用知识点 2.2.1 位操作 2.2.2 define 宏定义 2.2.3 条件编译 2.2.3.1 #ifdef 2.2.3.2 #ifndef 2.2.3.3 #if !defined 2.2.4 extern 变量声明 2.2.5 typedef 类型别名 …

微信用户可以通过哪些渠道查找和关注到公众号

什么是公众号 公众号&#xff0c;作为微信生态中不可或缺的一部分&#xff0c;已经成为连接用户与品牌、企业与个人的重要桥梁。它不仅是一个信息发布平台&#xff0c;更是一个集互动、服务、营销于一体的综合性工具。公众号通过发布高质量的内容&#xff0c;吸引用户关注&…

Leetcode—976. 三角形的最大周长【简单】(ranges::sort函数)

2024每日刷题&#xff08;122&#xff09; Leetcode—976. 三角形的最大周长 实现代码 class Solution { public:int largestPerimeter(vector<int>& nums) {ranges::sort(nums);for(int i nums.size() - 1; i > 1; i--) {if(nums[i - 1] nums[i - 2] > nu…

项目经理【过程】原则

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 【过程】原则 一、质量管理水平、质量管理的发展 1.1 质量管理水平 1.2 质量管理的发展 …

亲测快捷高效的编写测试用例方法

前言 测试用例是任何测试周期的第一步&#xff0c;对任何项目都非常重要。如果在此步骤中出现任何问题&#xff0c;则在整个软件测试过程中都会扩大影响。如果测试人员在创建测试用例模板时使用正确的过程和准则&#xff0c;则可以避免这种情况。 在本篇文章中将分享一些简单而…

【大学物理】双语合集听课笔记

7.5 angular momentu(角动量)_哔哩哔哩_bilibili 6.4Energy in Rotation Motion 有质量有速度的物体有动能&#xff0c;是不是很有道理 international system&#xff08;from French systeme international&#xff0c;acronym&#xff0c;SI&#xff09;of ineria kg*m^2 转…

[笔试训练](十六)

目录 046:字符串替换 047:神奇数 048:DNA序列 046:字符串替换 字符串替换_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 简单模拟题~ class StringFormat { public:string formatString(string str, int n, vector<char> arg, int m) {strin…

PPP点对点协议

概述 Point-to-Point Protocol&#xff0c;点到点协议&#xff0c;工作于数据链路层&#xff0c;在链路层上传输网络层协议前验证链路的对端&#xff0c;主要用于在全双工的同异步链路上进行点到点的数据传输。 PPP主要是用来通过拨号或专线方式在两个网络节点之间建立连接、…

牛客 二叉树 NB1 牛群的最大高度

原题链接 就不采用, 递归的方式来做了, 自己弄个栈来做 用栈来保存路径, curr 表示当前的节点, pre 保留往回走时的上一步 如果是 用递归来做 它的栈链路是这样的, 可以做下参考 黄色表示返回 用栈模拟的话, 不可能模拟得一摸一样, 递归的话一个栈会经过3次, 第三次后就不…

MATLAB实现遗传算法优化第三类生产线平衡问题

第三类生产线平衡问题的数学模型 假设&#xff1a; 工作站数量&#xff08;m&#xff09;和生产线节拍&#xff08;CT&#xff09;是预设并固定的。每个任务&#xff08;或作业元素&#xff09;只能分配到一个工作站中。任务的执行顺序是预先确定的&#xff0c;且不可更改。每…

ICode国际青少年编程竞赛- Python-2级训练场-列表入门

ICode国际青少年编程竞赛- Python-2级训练场-列表入门 1、 Dev.step(3)2、 Flyer.step(1) Dev.step(-2)3、 Flyer.step(1) Spaceship.step(7)4、 Flyer.step(5) Dev.turnRight() Dev.step(5) Dev.turnLeft() Dev.step(3) Dev.turnLeft() Dev.step(7) Dev.turnLeft() Dev.…

二叉树习题汇总

片头 嗨&#xff01;大家好&#xff0c;今天我们来练习几道二叉树的题目来巩固知识点&#xff0c;准备好了吗&#xff1f;Ready Go ! ! ! 第一题&#xff1a;二叉树的最大深度 解答这道题&#xff0c;我们采用分治思想 1. 递归子问题&#xff1a;左子树的高度和右子树的高度 …

Tkinter组件:Checkbutton

Tkinter组件&#xff1a;Checkbutton Checkbutton&#xff08;多选按钮&#xff09;组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像&#xff0c;你可以将一个 Python 的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被…

【汇编语言小练习输入两个数字然后输出它们的和】

这个程序是用汇编语言编写一个简单的程序&#xff0c;它将从键盘输入两个数字&#xff0c;然后输出它们的和。 .MODEL SMALL .STACK 100H.DATAINPUT_MSG1 DB Enter the first number: $INPUT_MSG2 DB 13, 10, Enter the second number: $RESULT_MSG DB 13, 10, The sum is: $N…
最新文章