【C++】C++11-基础

news/2024/9/18 3:11:50 标签: c++, 算法, 数据结构

目录

1、统一的列表初始化

1.1 {}初始化

1.2 std::initializer_list

2、声明

2.1 auto

2.2 decltype

2.3 nullptr

3、范围for

4、智能指针

5、STL中的一些变化

5.1 新容器

5.2 新方法


1、统一的列表初始化

1.1 {}初始化

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

struct Point
{
	int _x;
	int _y;
};
int main()
{
	Point pt = { 7,7 };
	int a1[] = { 1,2,3,4,5 };
	int a2[5] = { 0 };
	return 0;
}

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型使用初始化列表时,可添加等号(=),也可不添加

class Date
{
public:
	Date(int year = 0,int month = 1,int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
struct Point
{
	int _x;
	int _y;
};
int main()
{
	// 一切均可用列表初始化
    // 三种写法一样
	int x1 = 7;
	int x2 = { 7 };
	int x3{ 7 };

	Point p1 = { 7,7 };
	Point p2{ 7,7 };

	Date d1(2024, 8, 12);
	Date d2 = { 2024,8,12 };
	Date d3{ 2024,8,12 };
	//Date& d4 = { 2024,8,12 }; // 这样是错的,需要加const
	return 0;
}

拿上面Date类型的对象来做解释,d1是直接调用构造函数,d2是用{2024,8,12}构造一个临时对象,然后用这个临时对象拷贝构造d2,但通常会被优化为直接构造,这也是d4之所以不行的原因,d3和d2是一样的

都是单参数/多参数的隐式类型转换

1.2 std::initializer_list

initializer_list称为初始化列表,与上面的列表初始化是不同的,initializer_list用于容器的初始化

int main()
{
	Date d1 = { 2024,8,12 };
	vector<int> v1 = { 1,2,3,4,5,6,7 };
	return 0;
}

像这里Date类的对象初始化时给的参数需要和构造函数的参数相同,因为是用所给的参数去调用构造函数创建一个临时对象,再用临时对象拷贝构造d1。在vector这里,是用给的参数先创建一个initializer_list对象,这个对象中只有两个指针,大小始终为8字节(32位),空间是开在栈上的,然后用这个对象中的值去构造出vbector

int main()
{
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	return 0;
}

这段代码中,里面的{}是创建pair,外面的{}是创建map

2、声明

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

2.1 auto

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

int main()
{
	int i = 7;
	auto j = i;
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	map<string, string>::iterator it1 = dict.begin();
	auto it2 = dict.begin();
	cout << typeid(i).name() << endl;
	cout << typeid(j).name() << endl;
	cout << typeid(it1).name() << endl;
	cout << typeid(it2).name() << endl;
	return 0;
}

2.2 decltype

关键字decltype将变量的类型声明为表达式指定的类型
 

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;
	return 0;
}

typeid推导出类型后只能打印,decltype推导出类型后还能定义对象。这好像和auto有点像,不过decltype可以用于一些auto不能使用的场景

int main()
{
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	auto it = dict.begin();
	// 创建一个存放迭代器的vector
	vector<decltype(it)> v;
	return 0;
}

2.3 nullptr

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

3、范围for

这个在之前已经介绍过了

4、智能指针

由于这个内容较多,后序会单独讲解

5、STL中的一些变化

5.1 新容器

圈出来的这几个是新增的STL容器

array是数组,其对越界访问的检查更加严格,operator[]是断言,at是抛异常。普通数组越界读是检查不出来的,越界写只能检测距离数组大小接近的部分,距离太多是检查不出来的

forward_list是单向链表

5.2 新方法

如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。实际上C++11更新后,容器中增加的新方法最后用的插入接口函数的右值引用版本:

但是这些接口到底意义在哪?网上都说他们能提高效率,他们是如何提高效率的?

请看下面的右值引用和移动语义的讲解。另外emplace还涉及模板的可变参数,也需要再继续深入学习后面章节的知识。


http://www.niftyadmin.cn/n/5653280.html

相关文章

Android相关线程基础

线程基础 进程与线程 进程:可以被看做是程序的实体, 是系统进行资源分配和调度的基本单位. 线程:是操作系统调度的最小单元, 也叫轻量级进程 使用多线程的优点 可以减少程序的响应时间。如果某个操作很耗时, 能够避免陷入长时间的等待, 从而有着更好的交互性. 线程较之进…

若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)

文章目录 一、开发脚手架选择二、RuoYi框架1、介绍2、版本发展3、为什么选择若依4、优缺点5、项目内置功能 三、后端项目部署1、拉取源码2、环境要求3、Maven构建4、MySQL相关&#xff08;1&#xff09;导入SQL脚本&#xff08;2&#xff09;配置信息 5、Redis相关&#xff08;…

容器云服务价格高吗?容器云服务价格表一览

容器云服务价格高吗&#xff1f;一般来说&#xff0c;其价格并不是特别高。容器云服务的费用价格高低取决于多种因素&#xff0c;包括服务提供商、所选服务的类型、资源配置、地理位置等。对于服务器租用和托管而言&#xff0c;价格同样会受到配置、带宽、机房位置等因素的影响…

C语言从头学59——学习头文件math.h(二)

继续学习头文件<math.h>&#xff0c;编号接续前文。 六、三角函数 math.h中的三角函数包括&#xff1a; acos()&#xff1a;反余弦&#xff0c;参数范围-1至1&#xff0c;返回值double类型&#xff1a;0~PI asin()&#xff1a;反正弦&#xff0c;参…

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …

R语言数据整理和分析(1)

跟着顶刊学习数据分析。本期参考文献《Trends in Dietary Vitamin A Intake Among US Adults by Race and Ethnicity, 2003-2018》&#xff0c;来源于JAMA&#xff0c;IF63.1。 该文研究&#xff1a;2003-2018年美国成年人按种族和民族划分的膳食维生素A摄入量趋势 方法学&am…

数据结构与算法图论 并查集

前言 写一道并查集的题 判断是否为亲戚 原题目&#xff1a;现在有若干家族图谱关系&#xff0c;给出了一些亲戚关系&#xff0c;如Marrv和Tom是亲戚&#xff0c;Tom和Ben是亲戚等等。从这些信息中&#xff0c;你可以推导出Marry和Ben是亲戚。请写一个程序&#xff0c;对于我…

JAVAJDBC连接ORACLE数据库

1.选择的驱动版本&#xff08;jdk1.8oracle11G&#xff09; 2.获取驱动到本地 3.将驱动配置到maven 如果配置了环境变量命令操作符执行即可。 未配置环境变量需要在maven的bin目录下 mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc8 -Dversion12.2.0.1 -D…